2011-04-06 131 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); 
    }