我正在使用greendao ORM.我正在尝试使用SQLCipher加密我的数据库.Greendao自动支持sqlcipher.所以我写了以下加密代码.
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, "encrypted-db",null);
Database db = helper.getEncryptedWritableDb("mySecretPassword");
DaoSession session = new DaoMaster(db).newSession();
return session;
Run Code Online (Sandbox Code Playgroud)
但是,每当我使用此会话执行任何数据库操作时,都会出错
Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lorg/greenrobot/greendao/database/DatabaseOpenHelper$EncryptedHelper;
at org.greenrobot.greendao.database.DatabaseOpenHelper.checkEncryptedHelper(DatabaseOpenHelper.java:121)
at org.greenrobot.greendao.database.DatabaseOpenHelper.getEncryptedWritableDb(DatabaseOpenHelper.java:133)
Run Code Online (Sandbox Code Playgroud)
我的gradle依赖是 - >
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.2.0'
compile 'org.greenrobot:greendao:3.2.0'
compile 'com.google.code.gson:gson:2.8.0'
Run Code Online (Sandbox Code Playgroud)
我的计划是
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties
# If you do not use Rx:
-dontwarn rx.**
Run Code Online (Sandbox Code Playgroud)
那么如何使用greendao和SQLCipher加密我的数据库?
PS:Database db = helper.getEncryptedWritableDb("mySecretPassword");
此行在执行任何数据库操作时生成错误.
Database db …Run Code Online (Sandbox Code Playgroud) 我在项目中有2个数据库,其中一个是在我打开应用程序时创建的,另一个是由资产提供的.
生成DaoSession时,会为所有模型创建DaoSession.
gradle文件中的Schema也用于这两个数据库
如何区分2个数据库及其模式?
假设我们有以下实体:项目:
class Item {
...
@Index(unique=true)
private String guid;
...
@ToMany
@JoinEntity(entity = JoinItemsWithTags.class, sourceProperty = "itemGuid", targetProperty = "tagName")
private List<Tag> tagsWithThisItem;
...
}
Run Code Online (Sandbox Code Playgroud)
标签:
class Tag {
@Id
private Long localId;
@Index(unique = true)
private String name;
...
}
Run Code Online (Sandbox Code Playgroud)
我们需要加入他们.这是我的连接实体类:
@Entity(nameInDb = "item_tag_relations")
class JoinItemsWithTags {
@Id
private Long id;
private String itemGuid;
private String tagName;
...
}
Run Code Online (Sandbox Code Playgroud)
我想使用标记名称作为连接属性而不是Long id,因为在与服务器同步时更容易支持一致性.但是当前Item类中的标签getter总是返回一个空列表.我查看了日志并找到了在getter中内部使用的生成查询:
SELECT * <<-- there were a long sequence of fields
FROM "tags" T JOIN item_tag_relations J1
ON T."_id"=J1."TAG_NAME" …Run Code Online (Sandbox Code Playgroud)