2013-01-31 17 views
1

成功.delete()我想知道是否有人已經想通了如何「正確」檢查,如果在索引資料的delete()功能確實成功刪除的記錄。檢查在IndexedDB的

我發現這一點:

// As per spec http://www.w3.org/TR/IndexedDB/#object-store-deletion-operation 
// the result of the Object Store Deletion Operation algorithm is 
// undefined, so it's not possible to know if some records were actually 
// deleted by looking at the request result. 

這是否只是一種節約刪除,刪除記錄,然後檢查是否記錄在數據庫之前記錄鍵的事?

回答

3

添加.onsuccess處理由.delete方法返回的請求對象,如果它觸發的對象應該已被刪除。您還可以添加.onerror處理程序來處理從商店中刪除對象時出現問題的情況。

你當然可以保存密鑰,並隨後檢查商店在.onsuccess處理,但不應該是必要的;如果請求成功,則成功。

要小心,如果你是對交易做多件事情,連接到刪除請求一個.onsuccess處理器將盡快項已被刪除,如果你做其他操作在同一交易和火其他操作失敗,整個事務將回滾,包括刪除。在這種情況下,最好在事務中添加一個.onsuccess處理程序,以確保所有操作都成功。

+0

糾正我,如果我錯了,但沒有上面的報價意味着,不管'onsuccess'觸發'delete'可能沒有成功? – user1460015

+0

IndexedDB使用[原子事務](https://en.wikipedia.org/wiki/Atomic_transaction)。 'onsuccess'因爲刪除**成功**而觸發,如果在同一個事務上的另一個操作失敗,它可能會在成功後返回__。如果您對交易進行多項操作,則這一點至關重要;如果僅爲刪除創建事務,並且不對事務執行其他任何操作,則在刪除成功時,事務不會有任何失敗的機會。 –

+0

這是否也適用於'add()'方法?因爲它也被提到,即使'onsuccess'被觸發並不一定意味着它是「成功的」。 – user1460015

1

您可以簡單地檢查對象存儲器上是否存在get命令,您可以在刪除對象時檢索對象ID。

function checkIfObjectExist(objectID){ 
    var request = indexedDB.open(baseName); 
    request.onsuccess = function() { 
     var db = request.result; 
     var transaction = db.transaction(objectStoreName, 'readonly'); 
     var objectStore = transaction.objectStore(objectStoreName); 
     var selectRequest = objectStore.get(objectID); 
     selectRequest.onsuccess = function (e) { 
      if (e.target.result != null) { 
       console.log("Object Exist"); 
      }else{ 
       console.log("Object doesn't exist"); 
      } 
     } 

    } 
}