2013-05-10 94 views
0

我有一個具有keypath「id」(autoincrement)的對象存儲,以及該存儲上具有從服務器生成的keypath「myId」的唯一索引。 當我需要更新一條記錄時,我不會有「id」可用,所以我怎麼才能更新記錄只是通過使用「myId」考慮到索引是唯一的?Indexeddb - 通過索引鍵更新記錄

我已經嘗試過使用mystore.put(記錄),但是由於帶有「myId」的記錄已經存在,所以出現錯誤。

回答

3

既然你已經有了你的myId屬性上的唯一鍵索引,你可以根據該值檢索記錄。你需要使用onlyIDBKeyRangecursor查詢,像這樣:

var transaction = db.transaction('myStore'); 
var store = transaction.objectStore('myStore'); 
var index = store.index('myId_Index'); 
var keyRange = IDBKeyRange.only(obj.myId); 

var request = index.openCursor(keyRange); 

request.onsucess = function (e) { 
    var cursor = e.target.result; 

    if (cursor) { 
     var item = cursor.value; 
     obj.id = item.id; 
     //save the object 
    } 
}; 

另外,如果你想使用同一個事務更新,你需要使它成爲一個readwritereadonly像我一樣。

+3

要保存對象使用cursor.update(newValue) – dgrogan 2013-05-13 02:26:29

+0

謝謝,這看起來正是我所需要的。後續問題 - 我需要在一個事務中更新很多記錄,這裏顯示的方法是否是最好的方法 - http://stackoverflow.com/a/13666741/1781631 – ebi 2013-05-13 05:25:22

+0

如果您必須在一個事務中更新很多記錄,那麼您可能只想使用cursor.continue(nextMyId)而不是使用僅指定一個對象的keyRange來遍歷遊標。 – dgrogan 2013-05-13 16:00:16