4

I am creating a database in android using this code:

public class PackageDBHelper extends SQLiteOpenHelper{

//The Android's default system path of your application database.
private static String DB_PATH = "/data/data/com.myapp/databases/";

private static String DB_NAME = "my_db.db";

public SQLiteDatabase db; 

private final Context myContext;

public PackageDBHelper(Context context) {

    super(context, DB_NAME, null, 1);
    this.myContext = context;
}   
public void createDataBase() throws IOException{

    boolean dbExist = checkDataBase();

    if(dbExist){
        //do nothing - database already exist
    }else{

        //By calling this method and empty database will be created into the default system path
           //of your application so we are gonna be able to overwrite that database with our database.
        this.getReadableDatabase();  //error occurs here

        try {

            copyDataBase();

        } catch (IOException e) {

            throw new Error("Error copying database");

        }
    }

}

StackTrace:

android.database.sqlite.SQLiteDiskIOException: disk I/O error
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1668)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1684)
at android.app.ActivityThread.access$1500(ActivityThread.java:124)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:948)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3717)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.database.sqlite.SQLiteDiskIOException: disk I/O error
at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1849)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:197)
at com.myapp.util.PackageDBHelper.createDataBase(PackageDBHelper.java:51)

This app is on the market and I have received a few error reports. I have not been able to duplicate it on any of my devices, and the error is relatively rare. I realize the DB_PATH should probably be retrieved from the device, however that should not be effecting the call to getReadableDatabase().

Any ideas?

Patrick Jackson
  • 18,766
  • 22
  • 81
  • 141

2 Answers2

5

I had the same problem with HTC Desire HD, and Galaxy S on Android 2.1

Using the following as for DB_PATH seems to fix the problem:

Environment.getDataDirectory() + “/data/YOUR_PACKAGE/databases/”;

More details available here https://stackoverflow.com/a/4828540

Community
  • 1
  • 1
ccyrille
  • 873
  • 7
  • 18
0

try changing

public PackageDBHelper(Context context) {

    super(context, DB_NAME, null, 1);
    this.myContext = context;
} 

to

public PackageDBHelper(Context context) {

    super(context, "my_db", null, 1);//without the extension .db
    this.myContext = context;
} 
GAMA
  • 5,958
  • 14
  • 79
  • 126
  • Have you had this problem too? Is this a problem on some devices? It works for me as is on every device I have tested. Just would like some background on why you say do this before I change a app in production – Patrick Jackson Apr 24 '12 at 16:29
  • I haven't had the exact same issue but similar one. `SQLiteOpenHelper` constructor requires DB name without the extension. – GAMA Apr 25 '12 at 04:27
  • k. I will be trying this in my next update, if it works you'll get the correct answer. thanks – Patrick Jackson Apr 25 '12 at 13:01