2017-06-14 183 views
1

我使用GreenDao 3.2.2我的DB,GreenDao - Android电子 - OnUpgrade不会被调用(加密的数据库)

在我第一次运行时创建实体通过@tags一切工作正常。

现在我编辑gradle这个架构以更高的版本,因为我加了一些道具,一个表:

greendao { 
    schemaVersion 4 
} 

然而OpenHelper onUpgrade方法不会被调用,因此我的项目总是崩溃,因为一些列不找到。

应用类

//Init DB 
     UpgradeHelper helper = new UpgradeHelper(this, ENCRYPTED ? "db-encrypted" : "db", null); 
     Database db = ENCRYPTED ? helper.getEncryptedWritableDb("app-cipher") : helper.getWritableDb(); 
     daoSession = new DaoMaster(db).newSession(); 

OpenHelper类

public class UpgradeHelper extends DaoMaster.OpenHelper { 

    public UpgradeHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) { 
     super(context, name, factory); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

     //never gets called 
     Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion); 

     //do migrations 
    } 
} 

我这么想吗?

+0

你有权访问创建的数据库?你可以用SQLiteStudio打开它吗? – MatPag

+0

@MatPag是的,我可以 – htafoya

+0

@MatPag PRAGMA user_version命令给出gradle和DaoMaster中定义的正确的SCHEMA_VERSION :(但是我的表没有更新到最新的方案 – htafoya

回答

2

明白了!经过几个小时的搜索和阅读GreenDAO代码,我明白了这个问题。

问题是getEncryptedWritableDb创建另一种不延伸SQLiteDatabase的数据库。所以即使EncryptedHelper得到onUpgrade方法,我的帮助类也没有捕获它,因为它落入了另一个签名。

简单地使用接收一个DAO Database接口中的其他签名解决方案:

public void onUpgrade(Database db, int oldVersion, int newVersion) { 
     Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by migrating all tables data"); 

     //do migration 

    } 

当然我需要更新我的所有迁移方法接收Database对象,而不是一个StandardDatabase

+0

很有用;) – MatPag