14

私のAndroidプロジェクトでは、ORMLiteがキャッシュとして機能しています。Webサーバーからデータをダウンロードし、データベースに配置しています。オブジェクトを呼び出しcreateOrUpdateていますが、データベースに重複が表示されています。データベースエントリは、主キー(単に自動インクリメントされた整数)を除いて同一です。2番目のオブジェクトにはまだ主キーがないため、他のすべてのフィールドが同一であっても、ORMLiteは2つを異なるものと見なしていると思います。

これが本当かどうか誰かが知っていますか?

4

3 に答える 3

17

createOrUpdateオブジェクトにすでにidフィールドが設定されていない限り、呼び出してはいけません。ORMLiteデータベースに存在するかどうかを判断する方法は、IDによるクエリを実行することです。コードは次のことを行います。

ID id = extractId(data);
// assume we need to create it if there is no id  <<<<<<<<<<<<<<<<<<<<<<<
if (id == null || !idExists(id)) {
    int numRows = create(data);
    return new CreateOrUpdateStatus(true, false, numRows);
} else {
    int numRows = update(data);
    return new CreateOrUpdateStatus(false, true, numRows);
}

これをよりよく説明するために、javadocsを拡張します。彼らはそこで非常に弱いです。ごめん。私はそれらを次のように更新しました:

これは、アイテムが存在しない場合にデータベースにアイテムを作成するための便利な方法です。IDはデータ引数から抽出され、IDによるクエリがデータベースで実行されます。同じIDの行がデータベースに存在する場合、データベースのすべての列がデータパラメータのフィールドから更新されます。idがnull(または0またはその他のデフォルト値)であるか、データベースに存在しない場合、オブジェクトはデータベースに作成されます。これは、データ項目にidフィールドを定義する必要があることも意味します。

于 2012-04-23T21:07:21.840 に答える
0

update実際の一意の識別子に基づいて、既存のエントリのIDを手動で抽出してから、データベースを抽出する必要があるようです。一意のURLを使用した例:

CacheItem newEntry = fetchEntry("..."); // fetch it here
List<CacheItem> existing = mDao.queryForEq("url", newEntry.getUrl());
if (existing.size() > 0) {
    int id = existing.get(0).getId();
    newEntry.setId(id);
    mDao.update(newEntry);
} else mDao.create(newEntry);
于 2012-11-05T11:16:07.420 に答える
0

正常に機能するように主キーを設定します。

@DatabaseField(columnName = "id"、uniqueIndex = true)private int id;

私のために働いた。例外はバックグラウンドでスローされますが、機能します:D

于 2017-05-15T09:00:41.830 に答える