2011-04-06 152 views
2

我正在開發一個Android應用程序。 我的應用程序包含一個本地數據庫,位於應用程序的/ assests文件夾中。 當用戶安裝應用程序時,它會複製數據庫以便使用它。然後用戶可以添加項目。更新應用程序-Android

我的問題是,如果我將爲我的應用程序發佈更新,它是否會清除數據(刪除複製的數據庫),從而擦除用戶對數據庫的更改(因爲應用程序會再次從資產文件夾中複製數據庫)?

回答

0

號如果用戶在更新應用程序(不卸載它 - 在這種情況下將被刪除)和數據庫則已經存在的Android不會刪除它(它可能包含重要的信息!)。

而是調用SQLiteOpenHelper的onUpgrade方法,由您決定是要清除還是保留數據。

+0

好的謝謝,但我的問題是我如何完全保留數據?有沒有一種方法來測試它,而不實際升級? – Tofira 2011-04-06 13:57:12

+0

當然,只需在SQLiteOpenHelper的'onUpgrade'方法中放置'Log'語句或執行'SELECT'即可。只要你不明確地改變數據庫,它就會保持原樣。 http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onUpgrade(android.database.sqlite.SQLiteDatabase,int,int) – 2011-05-07 21:13:18

0

這完全取決於你如何複製它。你是否總是複製它而不檢查它是否已經存在?那麼是的,它可能會。儘管如此,你確實需要向我們展示一些代碼。

+0

我確實檢查它是否已經存在。我的問題是如果更新應用程序刪除現有的數據庫。是否像卸載並重新安裝應用程序? – Tofira 2011-04-06 05:20:19

0

您應該覆蓋在SQLiteOpenHelper的onUpgrade方法:

 /* 
    * (non-Javadoc) 
    * 
    * @see 
    * android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite 
    * .SQLiteDatabase) 
    */ 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // CREATE TABLE teas (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT 
     // NULL, brew_time INTEGER); 
     String sql = "CREATE TABLE " + TABLE_NAME + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME + " TEXT NOT NULL, " + BREW_TIME + " INTEGER" + ");"; 
     db.execSQL(sql); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite 
    * .SQLiteDatabase, int, int) 
    */ 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
     onCreate(db); 
    }