标签: greendao3

Android无法使用greendao使用sqlcipher加密数据库

我正在使用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)

android sqlcipher greendao sqlcipher-android greendao3

9
推荐指数
1
解决办法
796
查看次数

在Greendao中使用2个以上的数据库,使用2个不同的模式 - Android

我在项目中有2个数据库,其中一个是在我打开应用程序时创建的,另一个是由资产提供的.

生成DaoSession时,会为所有模型创建DaoSession.

gradle文件中的Schema也用于这两个数据库

如何区分2个数据库及其模式?

android greendao greendao3

7
推荐指数
2
解决办法
923
查看次数

如何使用除主键之外的源属性在GreenDAO中进行多对多关系查询?

假设我们有以下实体:项目:

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)

sqlite android android-sqlite greendao greendao3

5
推荐指数
0
解决办法
186
查看次数