DBFlowを Android アプリケーションに取り込もうとしています。ここのドキュメントに従っていますが、ライブラリを機能させることができません。
以下は、私が書いた関連ファイルです。
build.gradle
def dbflow_version = "4.0.0-beta3"
def sqlcipher_version = "3.3.1"
dependencies {
// ...
// DBFlow
annotationProcessor "com.github.Raizlabs.DBFlow:dbflow-processor:${dbflow_version}"
compile "com.github.Raizlabs.DBFlow:dbflow-core:${dbflow_version}"
compile "com.github.Raizlabs.DBFlow:dbflow:${dbflow_version}"
compile "com.github.Raizlabs.DBFlow:dbflow-sqlcipher:${dbflow_version}"
compile "net.zetetic:android-database-sqlcipher:${sqlcipher_version}@aar"
}
proguard-rules.pro
# sqlCipher
-keep class net.sqlcipher.** { *; }
-dontwarn net.sqlcipher.**
私のApplication
クラスでは、onCreate()
コールバック中に実行される次のものがあります
private void initFlowDb() {
DatabaseConfig.OpenHelperCreator openHelperCreator = SqlCipherHelperImpl::new;
DatabaseConfig databaseConfig = new DatabaseConfig.Builder(AppDatabase.class)
.openHelper(openHelperCreator)
.build();
FlowConfig flowConfig = new FlowConfig.Builder(this)
.openDatabasesOnInit(true)
.addDatabaseConfig(databaseConfig)
.build();
FlowManager.init(flowConfig);
}
そして、ここにそれぞれのデータベースクラスがあります
AppDatabase.java
@Database(name = AppDatabase.NAME, version = AppDatabase.VERSION)
public class AppDatabase {
public static final String NAME = "AppDatabase";
public static final int VERSION = 1;
}
そして、以下のような単純なモデルクラス
CreditCardDbModel.java
@Table(database = AppDatabase.class)
public class CreditCardDbModel extends BaseModel {
@Column
private String cardNumber;
@Column
private int expiryMonth;
@Column
private int expiryYear;
@Column
private int cvv;
// ...
}
次のコードはエラーをスローするものです
FlowManager.getDatabase(AppDatabase.class)
.beginTransactionAsync(databaseWrapper -> {
creditCardDbModel.save();
})
.success(transaction -> {
Timber.tag(TAG).d("Done saving model");
})
.error((transaction, error) -> {
Timber.tag(TAG).e("Error saving model");
Timber.tag(TAG).e(error);
})
.build()
.execute();
これにより、次の例外がトリガーされます
E com.raizlabs.android.dbflow.structure.InvalidDBConfiguration: Database: com.rperryng.android.db.AppDatabase is not a registered Database. Did you forget the @Database annotation?
E at com.raizlabs.android.dbflow.config.FlowManager.getDatabase(FlowManager.java:115)
E at com.rperryng.android.ui.main.other.AddPaymentActivity.onSaveCardClicked(AddPaymentActivity.java:107)
トランザクションの外部で使用しようとするとcreditCardDbModel.save()
(つまり、同期的に保存しようとすると)、同様のエラーが発生します。
E com.raizlabs.android.dbflow.structure.InvalidDBConfiguration: Model object: com.rperryng.android.db.CreditCardDbModel is not registered with a Database. Did you forget an annotation?
私が試したこと
- インスタント実行を無効にする
SQLCipher
統合を削除します。つまりinitFlowDb()
、単にあるように変更しますFlowManager.init(new FlowConfig.Builder(this).openDatabasesOnInit(true).build());
- これを読んだ後、バージョンを 4.0.0-beta2 に変更してみました。サイコロなし
- 私のプロガードルールに以下を追加しました
.
-keep class * extends com.raizlabs.android.dbflow.config.DatabaseHolder { ; }
-keep class com.raizlabs.android.dbflow.config.GeneratedDatabaseHolder
-keep class * extends com.raizlabs.android.dbflow.config.BaseDatabaseDefinition { *; }
-keep class com.rperryng.android.db.* { *; }
それでも、データベースが登録されていないという同じエラーが発生します。私は自分が間違っていることを本当に見ることができません。ドキュメントに戻って、すべてが正しくセットアップされていることを確認するために何度か調べましたが、まだこのエラーに遭遇していません。どんな助けでも大歓迎です!