Android Sqlite 未更新预填充的数据库

Android Sqlite not updating prepopulated database

我在 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

Now the problem is when i update data in my database and i increment the databse version onUpgrade() method is called but my database is not updated.

假设您的意思是您已经更新了预填充的数据库,因此希望应用新的预填充数据库(已放入资产文件夹) .然后你需要调用适当的 DatabaseHandler 的 copyDatabase 方法。

不建议在onUpragde方法中执行此操作,因为现阶段数据库已经open/allocated。

建议在 SQLiteOpenHelper sub class 的超级调用进行检查之前检查是否有升级到期。

DatabaseHandler 有一个方法 getVersionFromAssetFile 可以检索资产数据库的版本,而不是数据库的版本。

如果资产文件中的版本用于检查编码数据库版本 (DB_VERSION),则由于资产文件受保护且无法在应用程序内更改,因此测试编码数据库版本每次应用 运行.

时,资产版本都会导致不匹配(升级)

因此,您意味着根据数据库版本检查编码版本以检测升级。

因此,您可以更改 DatabaseHandler class 以包含 :-

/**
 * 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 增加),上述内容就会复制资产。更复杂的升级处理可以通过使用 getVersionFromDBInAssetFolder 例如

    来考虑资产数据库的版本
          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
  • 注意上面的代码是原理代码,没有经过运行,所以可能会有一些错误。