将android.database.sqlite.SQLiteOpenHelper更改为net.sqlcipher.database.SQLiteOpenHelper后,未调用onUpgrade和onCreate

时间:2018-03-15 17:04:49

标签: android sqlcipher-android

我一直关注official documentation,以便在我正在开发的应用中开始使用SQLCipher社区版。所以,我做了一个正确的gradle导入如下:

compile 'net.zetetic:android-database-sqlcipher:3.5.9@aar'

我添加了

@Override
public void onCreate() {
   super.onCreate();
   SQLiteDatabase.loadLibs(this);
}
MainApplication.java中的

。 由于我的应用程序已经发布,我已经在我的SQLiteOpenHelper类实例中的onUpgrade()方法中放置了一些迁移代码。 不幸的是,虽然我升级了数据库版本号,但我还是打电话: getInstance().getReadableDatabase("testKey"); 既不会调用onUpgrade(),也不会调用onCreate()方法。 我在配置中遗漏了什么吗?

2 个答案:

答案 0 :(得分:0)

就像你在以前没有加密的数据库中第一次使用密码一样,我建议你强制重新创建数据库。

为此,您只需在DatabaseHelper类中更改数据库名称即可。更改数据库名称后,当设备更新时,onCreate()将触发,它将从零开始创建所有数据库。

public class YourDatabaseHelper extends SQLiteOpenHelper {

   public final static String DATABASE_NAME = Constants.DATABASE_NAME; // Change the name to force the database to be created from zero.
   public final static int CURRENT_VERSION = Constants.DATABASE_VERSION_INT;


   public DatabaseHelper(Context context){
       super(context, DATABASE_NAME, null, CURRENT_VERSION);        
   }

   public void onCreate(SQLiteDatabase db){
       // Create all your tables.
   }

   public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
       // No need to do anything in here, because onCreate will be triggered.
   }

}

答案 1 :(得分:0)

最后,我找到了问题的解决方案。我没有在onUpgrade()方法中调用迁移功能,而是在第一次查询数据库之前(打开应用程序之后)添加了迁移代码:

@foreach(var property in typeof(DepartmentDetails).GetProperties())
{
    var label = property.Name;
    var value = property.GetValue(Model.DepartmentDetails);
}

我从这个source获得了解决方案。感谢作者,无论他是谁!