私はOrmLiteSqliteOpenHelper
のカスタムサブクラスを持っています。私の理解では、super.getDao(Class<T> clazz)
は基本的に背後DaoManager.createDao(this.getConnectionSource(),clazz)
への呼び出しを行っているということですDaoManagerのORMLite OpenHelper DAOキャッシュ?
@Override
public <D extends Dao<T, ?>, T> D getDao(Class<T> arg0) throws SQLException {
D dao = super.getDao(arg0);
if (dao.getObjectCache() == null && !UNCACHED_CLASSES.contains(arg0))
dao.setObjectCache(InsightOpenHelperManager.sharedCache());
return dao;
}
:私は、私は、メモリ内のオブジェクトにDBの行からアイデンティティマッピングを持っていることを確認するためにObjectCache
インタフェースを使用したいので、私はとしてgetDao(...)
を上書きシーンが存在する場合、キャッシュされたDAOを見つけるはずです。しかし...
final DatabaseHelper helpy = CustomOpenHelperManager.getHelper(StoreDatabaseHelper.class);
final CoreDao<Store, Integer> storeDao = helpy.getDao(Store.class);
DaoManager.registerDao(helpy.getConnectionSource(), storeDao);
final Dao<Store,Integer> testDao = DaoManager.createDao(helpy.getConnectionSource(), Store.class);
は、私が(でもW/O registerDao(...)
コール)storeDao
とtestDao
が同じオブジェクトへの参照であることを期待します。しかし私は、Eclipseのデバッガでこれを参照してください。
また、testDao
のオブジェクトキャッシュがnullです。
ここで何か問題がありますか?これはバグですか?
私はカスタムヘルパーマネージャを持っていますが、複数のデータベースを管理する必要があったためです。インスタンスへのClass<? extends DatabaseHelper>
キーのハッシュマップです。
私がDAOキャッシュを必要とするのは、自分のグローバルキャッシュを使用しないで内部的に生成されたDAOによって複数の外部コレクションが読み込まれているためです。
私がこれを書いていたように、私は、私はちょうどDaoManager.createDao(...)
に至るまで、私の上書きhelpy.getDao(...)
電話を持っていると考えていたが、それは同じことになり:私はまだcreateDao(...)
への2回目の呼び出しで異なるDAOを取得します。これは私には完全にDaoManager
のドキュメントに反対するようです。私は事前生成設定ファイルを使用していますので、
public static synchronized void registerDao(ConnectionSource connectionSource, Dao<?, ?> dao) {
if (connectionSource == null) {
throw new IllegalArgumentException("connectionSource argument cannot be null");
}
if (dao instanceof BaseDaoImpl) {
DatabaseTableConfig<?> tableConfig = ((BaseDaoImpl<?, ?>) dao).getTableConfig();
if (tableConfig != null) {
tableMap.put(new TableConfigConnectionSource(connectionSource, tableConfig), dao);
return;
}
}
classMap.put(new ClassConnectionSource(connectionSource, dao.getDataClass()), dao);
}
がDaoManager
のソースのライン230上のreturn
は(更新されてからclassMap
を防止することを:
まず、私はそれが犯人かもしれregisterDao(...)
のように見えたと思いました?)。私のコードが2回目の作成呼び出しに当たったら、最初にclassMap
を見て、何らかの形で(私のより良い理解に対して)そこに住んでいるDAOの別のコピーを見つけます。最初の作成を進めるので、私はclassMap
が初期化されるのを見ました。
しかし、2番目のDAOはどこから来るのでしょうか?
グレイの洞察を楽しみにしています! :-)
ちょうどあなたの問題を解決しなければならないスナップショットリリースベンを押し出します。お知らせ下さい。 http://ormlite.com/releases/ – Gray
テスト中です。私のカスタムDAOを今作成している例外を当て、それを調べます。 –
'Store'で1対多の関係を持つ私のクラスの1つが、' FieldType:287'に例外をスローしています。 'dataPersister'は' IntType'のインスタンスなので、それは基本的な型だと考えていますか? 4.33の下でこれを見ていなかった。 –