我在我的 android 應用程式中使用預填充的 sqlite 資料庫。現在的問題是當我更新我的資料庫中的資料并且我增加了資料庫版本onUpgrade()方法被呼叫但我的資料庫沒有更新時。任何幫助,將不勝感激。
這是我的 DatabaseHelper.java
public class DatabaseHelper extends SQLiteOpenHelper {
private Context mContext;
private SQLiteDatabase mDatabase;
public DatabaseHelper(Context context) {
super(context, Constants.DB_NAME, null, Constants.DB_VERSION);
this.mContext = context;
// Copy the Database if no database exists
if (!DatabaseHandler.checkDataBase(context)) {
DatabaseHandler.copyDataBase(context, Constants.DB_NAME, Constants.DB_VERSION);
}
mDatabase = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void openDatabase() throws SQLException {
mDatabase = this.getWritableDatabase();
}
public Cursor getAllQuotes() {
String query = "SELECT * FROM " Constants.TABLE_QUOTE;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = null;
try {
openDatabase();
cursor = db.rawQuery(query, null);
} catch (Exception e) {
e.printStackTrace();
}
return cursor;
}
@Override
public synchronized void close() {
if (mDatabase != null)
mDatabase.close();
super.close();
}
}
這是我的DatabaseHandler.java
uj5u.com熱心網友回復:
現在的問題是,當我更新資料庫中的資料并增加資料庫版本時,呼叫了 onUpgrade() 方法,但我的資料庫沒有更新。
假設您的意思是您已更新預填充資料庫,因此希望應用新的預填充資料庫(已放入資產檔案夾)。然后你需要呼叫相應的DatabaseHandler 的copyDatabase方法。
不建議在onUpragde方法中執行此操作,因為在此階段資料庫已經打開/分配。
建議在 SQLiteOpenHelper 子類的超級呼叫進行檢查之前檢查是否有升級到期。
DatabaseHandler 有一個方法getVersionFromAssetFile可以檢索資產資料庫的版本,而不是資料庫的版本。
如果資產檔案中的版本用于檢查編碼資料庫版本 (DB_VERSION),那么由于資產檔案受到保護且無法在應用程式內更改,因此使用資產版本測驗編碼資料庫版本將導致不匹配(升級) 每次運行應用程式時。
因此,您可以根據資料庫版本檢查編碼版本以檢測升級。
因此,您可以更改 DatabaseHandler 類以包括:-
/**
* Get the SQLite user_version from the DB
* @param context used to get the database path
* @param databaseName the name of the database (assumes database is stored in default location)
* @return the version number as stored in the Database
*/
public static int getVersionFromDatabaseFile(Context context, String databaseName) {
InputStream is;
try {
is = new FileInputStream(context.getDatabasePath(databaseName));
} catch (IOException e) {
return OUCH;
}
return getDBVersionFromInputStream(is);
}
然后,您可以修改確定是否應復制資產以在資料庫不存在時復制資產或如果資料庫版本低于編碼版本時資料庫存在時復制資產(新)的測驗。
例如:-
public DatabaseHelper(Context context) {
super(context, Constants.DB_NAME, null, Constants.DB_VERSION);
this.mContext = context;
// Copy the Database if no database exists
// **NEW** or copy the Database if the database version is less than the
// coded version (DB_VERSION)
if (!DatabaseHandler.checkDataBase(context)) {
DatabaseHandler.copyDataBase(context, Constants.DB_NAME, Constants.DB_VERSION);
} else {
if (DatabaseHandler.getVersionFromDatabaseFile(context,Constants.DB_NAME) < Constants.DB_VERSION) {
DatabaseHandler.copyDataBase(context,Constants.DB_NAME,Constants.DB_VERSION);
}
}
mDatabase = this.getWritableDatabase();
}
請注意,每當編碼版本(DB_VERSION 增加)時,上述內容都會復制資產。更復雜的升級處理可以通過使用
getVersionFromDBInAssetFoldereg來考慮資產資料庫的版本if (DatabaseHandler.getVersionFromDatabaseFile(context,Constants.DB_NAME) < Constants.DB_VERSION && DatabaseHandler.getVersionFromDBInAssetFolder(context,Constants.DB_NAME) == Constants.DB_VERSION ) { DatabaseHandler.copyDataBase(context,Constants.DB_NAME,Constants.DB_VERSION ); }- 因此,只有在資產資料庫中的版本與更新后的 DB_VERSION 相同時才會發生資產副本
請注意,上面的代碼是原理代碼,尚未運行,因此可能包含一些錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/341406.html
標籤:安卓 sqlite android-sqlite android-room 安卓数据库
