2012-03-21 4 views
4

Я создаю базу данных в Android, используя этот код:SQLiteDiskIOException: ошибка ввода/вывода диска при создании базы данных

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) 

Это приложение на рынке, и я получил несколько отчетов об ошибках. Я не смог дублировать его на любом из моих устройств, и ошибка относительно редка. Я понимаю, что DB_PATH следует, вероятно, извлечь из устройства, однако это не должно приводить к вызову getReadableDatabase().

Любые идеи?

ответ

5

У меня была такая же проблема с HTC Desire HD и Galaxy S на Android 2.1

Использование следующих за DB_PATH, кажется, исправить проблема:

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

Более подробная информация доступна здесь https://stackoverflow.com/a/4828540

0

попытка изменения

public PackageDBHelper(Context context) { 

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

в

public PackageDBHelper(Context context) { 

    super(context, "my_db", null, 1);//without the extension .db 
    this.myContext = context; 
} 
+0

У вас тоже была эта проблема? Это проблема на некоторых устройствах? Он работает для меня, как и на каждом устройстве, которое я тестировал. Просто хотел бы узнать, почему вы говорите, что делаете это до того, как я сменил приложение на производстве. – Patrick

+0

У меня не было той же самой проблемы, кроме аналогичной. Для конструктора SQLiteOpenHelper требуется имя базы данных без расширения. – GAMA

+0

k. Я попробую это в своем следующем обновлении, если это сработает, вы получите правильный ответ. благодаря – Patrick

Смежные вопросы