簡體   English   中英

從資產文件夾升級Android SQLite數據庫

[英]OnUpgrade Android SQLite Database from Assets Folder

我目前有一個我在Assets文件夾中使用的數據庫。 我有升級它的問題。 每當我啟動DATABASE_VERSION數字時,它只會更新某些時間。 當它升級時,它會在開始時崩潰,我必須重新打開應用程序。

這是我的createDatabase()

public void createDataBase() throws IOException {
boolean dbExist = checkdatabase();
if (dbExist) {
    Log.v("DB Exists", "db exists");
    // By calling this method here onUpgrade will be called on a
    // writeable database, but only if the version number has been
    // bumped
    this.getWritableDatabase();
}
dbExist = checkdatabase();
if (!dbExist) {
    // 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();
    try {
        copyDataBase();
    } catch (IOException e) {
        throw new Error("Error copying database");
    }
}
}

onUpgrade()

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (newVersion > oldVersion){
        Log.v("Database Upgrade", "Database version is higher than previous.");
        myContext.deleteDatabase(DB_NAME);

}

我想刪除我正在使用的舊數據庫,只是讓新數據庫可用於應用程序布局。

createDataBase()添加到onUpgrade()時,這是我的LogCat

03-06 15:17:15.348: V/DB Exists(2150): db exists
03-06 15:17:15.388: V/Database Upgrade(2150): Database version is higher than previous.
03-06 15:17:15.398: D/AndroidRuntime(2150): Shutting down VM
03-06 15:17:15.398: W/dalvikvm(2150): threadid=1: thread exiting with uncaught exception (group=0xb3f6d648)
03-06 15:17:15.418: E/AndroidRuntime(2150): FATAL EXCEPTION: main
03-06 15:17:15.418: E/AndroidRuntime(2150): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.productguide/com.example.productguide.PowersportsEquivalent}: java.lang.IllegalStateException: getDatabase called recursively
03-06 15:17:15.418: E/AndroidRuntime(2150):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at android.os.Looper.loop(Looper.java:137)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at android.app.ActivityThread.main(ActivityThread.java:5103)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at java.lang.reflect.Method.invokeNative(Native Method)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at java.lang.reflect.Method.invoke(Method.java:525)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at dalvik.system.NativeStart.main(Native Method)
03-06 15:17:15.418: E/AndroidRuntime(2150): Caused by: java.lang.IllegalStateException: getDatabase called recursively
03-06 15:17:15.418: E/AndroidRuntime(2150):     at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at com.example.productguide.DataBaseHelper.createDataBase(DataBaseHelper.java:143)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at com.example.productguide.DataBaseHelper.onUpgrade(DataBaseHelper.java:248)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:257)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at com.example.productguide.DataBaseHelper.createDataBase(DataBaseHelper.java:136)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at com.example.productguide.PowersportsEquivalent.onCreate(PowersportsEquivalent.java:57)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at android.app.Activity.performCreate(Activity.java:5133)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
03-06 15:17:15.418: E/AndroidRuntime(2150):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
03-06 15:17:15.418: E/AndroidRuntime(2150):     ... 11 more

瀏覽Google時,我找到了問題的答案。

通過將以下代碼添加到我的copyDataBase()

SQLiteDatabase checkdb = null;

try{
String myPath = DB_PATH + DB_NAME;
checkdb = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);

// Once the DB has been copied, set the new version
checkdb.setVersion(DATABASE_VERSION);
}
catch(SQLiteException e)
{
//database does’t exist yet.
}

並在onUpgrade()中包含以下代碼

if (oldVersion < newVersion){
    Log.v("Test", "Within onUpgrade. Old is: " + oldVersion + " New is: " + newVersion);
    myContext.deleteDatabase(DB_NAME);
    try {
        copyDataBase();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我的數據庫現在升級到數據庫,並在每次更改DATABASE_VERSION整數時刪除先前的DATABASE_VERSION

java.lang.IllegalStateException: getDatabase called recursively

這是通過從onCreate()onUpgrade()回調調用例如getReadableDatabase()getWritableDatabase()引起的。 回調被作為部分數據庫打開過程調用,試圖在那時再次打開它將是一個錯誤,可能導致無限遞歸,除非SQLiteOpenHelper檢測到並拋出此異常。

進一步向下堆棧跟蹤:

 at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188)
 at com.example.productguide.DataBaseHelper.createDataBase(DataBaseHelper.java:143)
 at com.example.productguide.DataBaseHelper.onUpgrade(DataBaseHelper.java:248)

因此onUpgrade()調用調用getReadableDatabase() createDataBase() getReadableDatabase() 您發布的代碼沒有顯示,它可能是其他版本的代碼。

要獲得經過測試和測試的幫助程序以與預填充數據庫一起使用,請考慮使用jgilfelt / sqlite-asset-helper

我想我有一個更簡單的解決方案,只需將其添加到您的DB Helper類:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    super.setForcedUpgrade(newVersion);
    super.onUpgrade(db, oldVersion, newVersion);
}

這將忽略現有的任何先前版本,並將其替換為“asset”文件夾中的版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM