0

アップグレード イベント中に IndexedDB に渡される一連の JSON データを作成しました。一見問題のない非常に優れた IndexedDB データベースが作成されます。問題は、データベースをバージョン 1 から 2 にアップグレードすると、JSON をループして適用するだけなので、既存のデータがすべて上書きされることです。

一意のキーを持たない新しいデータベース項目が何も書き込まないようにするために、アップグレードには何らかの方法が必要です。どうすればいいですか?以下は現在のデータを上書きするだけです。

objectStore = event.currentTarget.transaction.objectStore('player');
objectStore.put({ key: 'non unique, but I replace my twin\'s data anyway', data: value });

助けてくれてありがとう、すべてを検索しましたが、この問題の解決策が見つかりません。

編集2012 年 8 月 24 日

情報を確認するために get を使用するというクリストフの推奨に従って、私は少し掘り下げて調査しました。答えを見つけた後、私はあなたを助けるためにいくつかの疑似コードを書くことにしました.

// Create the get request inside your upgrade
var tableData = event.currentTarget.transaction.objectStore('your table name');
var getData = tableStore.get('your key');

// Run the get request
getData.onsuccess = function (e) {
    var result = e.target.result;

    // Immediately exit if the current result is not undefined
    if (result !== undefined) {
        return;
    }

    // Note, you may or may not need a closure to write data in the callback
    // See here for more info on closures in events http://stackoverflow.com/questions/3495679/passing-parameters-in-javascript-onclick-event#answer-3495722
    tableStore.add('data to add');
};
4

1 に答える 1

2

データの上書きは、データベースに既に存在するキーが見つかった場合にのみ発生します。キーが見つからない場合は、追加されます。

このデータが再度挿入されたり更新されたりするのを防ぎたい場合は、いくつかの解決策があります。

  • データを入れる前に、そのキーが存在するかどうかを確認します(getメソッド)
  • put の代わりに add メソッドを使用します。(キーがすでに存在する場合、これはエラーになります。あまり良くありません)
  • データベースの古いバージョンが 0 または何もないことを確認してから、挿入を実行してください。
于 2012-08-23T05:56:55.643 に答える