1

私は GreenDao を使用して、エンティティのいくつかの値を更新するのに役立つコア関数を作成しています。エンティティがデータベースにない場合は、エンティティも挿入します。問題は、エンティティのキ​​ャッシュされたコピーを常に取得していることです。GreenDao がいくつかの単純なキャッシュを管理していることを知っており、それをバイパスできるようにしたいと考えています。データベースから直接クエリを実行する方法を知っている人はいますか?

これは機能しません

.Dao().queryBuilder().where(comDao.Properties.Id.eq(id)).build().listLazyUncached();
4

1 に答える 1

0

GreenDao は確かに、その daoCore.jar ソースに内部キャッシュ メカニズムを備えています。

キャッシュからエンティティを put() および get() するコードを検索することで、キャッシュを簡単に無効にすることができます。

 which is a: HashMap<? extends AbstractDao>.

次に MyDaoCore.jar を生成し、プロジェクトに追加します。

第 2 に、エンティティを (完全に置き換えることなく) 更新または挿入するには、次の疑似コードを実装する必要があります。実際のコードを追加していなくて申し訳ありません。ずっと前に解決しました。

public void insertOrUpdate(List<? extends AbstractDao> entities){
    List<Entity> toInsert;
    List<Entity> toUpdate;

    for (Entity e : entities) 
    {
       if( e.inDatabase() )
            toUpdate.add(e);
       else 
            toInsert.add(e);
    }
    Dao.updateAll(toUpdate);
    Dao.insertAll(toInsert);
}

編集 1: IN ステートメントを使用して、次のような 1 つのクエリだけでエンティティのすべての ID を取得できます。

.where(Dao.Properties.Id.in(ids)).build().list();
于 2014-04-01T13:54:42.753 に答える