2013-03-09 35 views
7

Thêm đối tượng vào đối tượng IndexedDBStore sẽ thất bại nếu khóa đã tồn tại. Làm thế nào tôi có thể kiểm tra sự tồn tại của một đối tượng với một khóa nhất định - tốt nhất là đồng bộ (không có lý do cho một lớp callbacks khác) và không kéo đối tượng.Kiểm tra nếu đối tượng IndexedDBStore đã chứa khóa

Tôi biết cách thực hiện yêu cầu không đồng bộ thông qua giao dịch, nhưng có vẻ như một chút thử thách phải trải qua mỗi lần tôi muốn thêm đối tượng.

lưu ý Giải pháp duy nhất phải làm việc trong Chrome (nếu điều đó giúp)

Trả lời

6

Cho đến nay không có trình duyệt nào có API đồng bộ hóa được triển khai, do đó bạn sẽ phải làm điều đó không đồng bộ. An objectStore cho thấy phương thức get mà bạn cung cấp bằng một khóa và nó sẽ trả lại cho bạn đối tượng (hoặc null) khớp với khóa.

Có một hướng dẫn thực sự tốt trên MDN bao gồm sử dụng IDB, và getting a record được bao phủ quá, nhưng mã inlined là:

db.transaction("customers").objectStore("customers").get("444-44-4444").onsuccess = function(event) { 
    alert("Name for SSN 444-44-4444 is " + event.target.result.name); 
}; 

Nếu bạn không muốn lấy lại kỷ lục sau đó bạn luôn có thể sử dụng count phương pháp trên chỉ mục như được giải thích here in the spec. Dựa trên kết quả của việc đó, bạn có thể sử dụng add hoặc put để sửa đổi bản ghi, nó sẽ lưu giải nén bản ghi nếu bạn không cần.

+0

Lý tưởng nhất là tôi sẽ không rút ra và khởi tạo một bản ghi (một số đối tượng có rất nhiều dữ liệu lồng nhau). Tìm kiếm một cái gì đó giống như EXISTS của SQL.Tôi biết indexedDB không phải là dựa trên SQL, nhưng các cửa hàng giá trị quan trọng khác như Redis hỗ trợ kiểm tra sự tồn tại của một khóa – Chris

+0

@Chris - nah không có phương pháp như vậy, tôi đã thêm một giải pháp thay thế khác để làm việc đó nếu bạn không ' t muốn hydrate các đối tượng –

+0

Vâng mà câu trả lời nó, mặc dù không phải là cách tôi hy vọng haha. Cảm ơn bạn! – Chris

10

Cách tốt nhất để kiểm tra sự tồn tại của một mấu chốt là objectStore.count (key). Đó là không đồng bộ.

Trong trường hợp của bạn, tùy chọn tốt nhất là openCursor của khóa của bạn. Nếu tồn tại, con trỏ sẽ xuất hiện.

var req = objectStore.openCursor(key); 
req.onsuccess = function(e) { 
    var cursor = e.target.target; 
    if (cursor) { // key already exist 
    cursor.update(obj); 
    } else { // key not exist 
    objectStore.add(obj) 
    } 
}; 
+2

Vâng điều này có vẻ là điều gần gũi nhất với những gì tôi muốn. Cọc trên những lời hứa! – Chris

1

Câu hỏi đặt ra là tại sao bạn muốn biết điều này? Có lẽ bạn nên sử dụng một cách tiếp cận khác?

Bạn có thể sử dụng tăng tự động, theo cách này bạn không cần phải kiểm tra xem khóa có tồn tại hay không, bạn sẽ luôn nhận được khóa duy nhất.

Bạn cũng có thể sử dụng phương thức đặt thay vì phương thức thêm. Với việc đặt dữ liệu sẽ được cập nhật nếu khóa tồn tại và nếu khóa không tồn tại thì dữ liệu sẽ được thêm vào.

Mọi thứ phụ thuộc vào lý do bạn muốn kiểm tra xem có điều gì đó tồn tại hay không.

+0

Bởi vì tôi đang xây dựng một ứng dụng, khi cài đặt, nạp JSON vào làm dữ liệu demo. Trong thử nghiệm - và trong một số trường hợp trong tự nhiên - cài đặt gọi lại sẽ kích hoạt nhiều lần để dữ liệu demo thực sự đã tồn tại (như indexedDB không bị xóa). – Chris

+0

Vì vậy, trong trường hợp đó bạn có thể sử dụng phương thức đặt. Dữ liệu hiện có sẽ bị ghi đè và dữ liệu mới sẽ được thêm –

+1

Được rồi, hoạt động trong trường hợp rất cụ thể này, nhưng điều đó không giống như kiểm tra sự tồn tại. Đó là chỉ buộc dữ liệu vào DB. Có những trường hợp khác mà tôi có thể tưởng tượng ai đó muốn kiểm tra sự tồn tại của một kỷ lục mà không cần kéo dữ liệu hoặc lực lượng cập nhật nó. – Chris

2

Hơi muộn để có câu trả lời nhưng có thể giúp người khác trả lời. Tôi vẫn vấp -Như i guess- trên cùng một vấn đề, nhưng nó rất đơn giản:

Nếu bạn muốn INSERT hoặc hồ sơ CẬP NHẬT bạn sử dụng objectStore.put(object)(help)
Nếu bạn chỉ muốn INSERT hồ sơ bạn sử dụng objectStore.add(object)(help)

Vì vậy, nếu bạn sử dụng add(object) và khóa bản ghi vẫn tồn tại trong DB, nó sẽ không ghi đè và kích hoạt lỗi 0 "ConstraintError: Khóa đã tồn tại trong kho lưu trữ đối tượng".

Nếu bạn sử dụng put(object), nó sẽ bị ghi đè.

Các vấn đề liên quan