0
我有一個具有keypath「id」(autoincrement)的對象存儲,以及該存儲上具有從服務器生成的keypath「myId」的唯一索引。 當我需要更新一條記錄時,我不會有「id」可用,所以我怎麼才能更新記錄只是通過使用「myId」考慮到索引是唯一的?Indexeddb - 通過索引鍵更新記錄
我已經嘗試過使用mystore.put(記錄),但是由於帶有「myId」的記錄已經存在,所以出現錯誤。
我有一個具有keypath「id」(autoincrement)的對象存儲,以及該存儲上具有從服務器生成的keypath「myId」的唯一索引。 當我需要更新一條記錄時,我不會有「id」可用,所以我怎麼才能更新記錄只是通過使用「myId」考慮到索引是唯一的?Indexeddb - 通過索引鍵更新記錄
我已經嘗試過使用mystore.put(記錄),但是由於帶有「myId」的記錄已經存在,所以出現錯誤。
既然你已經有了你的myId
屬性上的唯一鍵索引,你可以根據該值檢索記錄。你需要使用only
IDBKeyRange
和cursor
查詢,像這樣:
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
}
};
另外,如果你想使用同一個事務更新,你需要使它成爲一個readwrite
不readonly
像我一樣。
要保存對象使用cursor.update(newValue) – dgrogan 2013-05-13 02:26:29
謝謝,這看起來正是我所需要的。後續問題 - 我需要在一個事務中更新很多記錄,這裏顯示的方法是否是最好的方法 - http://stackoverflow.com/a/13666741/1781631 – ebi 2013-05-13 05:25:22
如果您必須在一個事務中更新很多記錄,那麼您可能只想使用cursor.continue(nextMyId)而不是使用僅指定一個對象的keyRange來遍歷遊標。 – dgrogan 2013-05-13 16:00:16