2013-09-04 53 views
7

Tôi đang sử dụng IndexedDB và tôi có hai cửa hàng đối tượng: trang bị (đại diện cho thiết bị khác nhau, chính chủ chốt tagNo) và equipParts (đại diện cho các bộ phận của một phần của thiết bị và có chỉ mục dựa trên số thẻ/số sê-ri, khóa chính seqNo, với trường tagNo đại diện cho thiết bị là một phần của).Xóa nhiều bản ghi trong IndexedDB dựa trên chỉ số

Nếu tôi xóa một bản ghi trong trang bị, tôi muốn xóa tất cả các bản ghi trong equipParts mang tagNo của trang bị (giống như "nơi equipParts.tagNo = equip.tagNo").

Trích từ mã của tôi:

var tx = db.transaction(["equip", "equipParts"],"readwrite"); 
var estore = tx.objectStore("equip"); 
var pstore = tx.objectStore("equipParts"); 
var tagIndex = pstore.index("by_tagNo"); 
var pdestroy = tagIndex.openCursor(IDBKeyRange.only(tagno)); //opens all records bearing the selected tag number 
pdestroy.onsuccess = function() { 
    var cursor = pdestroy.result; 
    if (cursor) { 
     if (cursor.value.tagNo == tagno) { 
      pstore.delete(cursor.value.seqNo); //I guess I'm wrong here 
     } 
     cursor.continue; 
    } 
} 
pdestroy.onerror = function() { 
    alert("Deletion attempt NG"); 
} 
var ereq = estore.delete(tagno); 
ereq.onsuccess = function(e) { 
    alert("Form deletion OK"); 
    window.location = "index.html"; 
} 
ereq.onerror = function(e) { 
    alert("Form deletion NG"); 
    window.location = "index.html"; 
} 
db.close(); 

Vấn đề là chỉ có hồ sơ trong trang bị bị xóa; các bản ghi trong equipParts vẫn ở đó. Có cách nào để xóa nhiều bản ghi trong một kho lưu trữ đối tượng IndexedDB dựa trên một chỉ mục không duy nhất (có thể là khóa chính của kho lưu trữ đối tượng cha) không?

Trả lời

8

Bạn phải lấy các khóa chính để xóa các bản ghi.

var pdestroy = tagIndex.openKeyCursor(IDBKeyRange.only(tagno)); 
pdestroy.onsuccess = function() { 
    var cursor = pdestroy.result; 
    if (cursor) { 
     pstore.delete(cursor.primaryKey); 
     cursor.continue; 
    } 
} 

Ngoài ra, nhưng không hiệu quả

var pdestroy = tagIndex.openCursor(IDBKeyRange.only(tagno)); 
pdestroy.onsuccess = function() { 
    var cursor = pdestroy.result; 
    if (cursor) { 
     cursor.delete(); 
     cursor.continue; 
    } 
} 
+1

Tại sao là lần thứ hai không hiệu quả? –

+1

'returnCursor' return' IDBCursorWithValue', đòi hỏi phải đọc giá trị bản ghi, trong khi giá trị đầu tiên trả về 'IDBCursor' không có giá trị bản ghi. –

+1

Cảm ơn. Có phải là đúng mặc dù chỉ sau này là làm toàn bộ xóa trong cùng một giao dịch? –