2017-04-07 17 views
5

Tôi đang cố gắng tạo một IndexedDB thực sự đơn giản với một số JavaScript, nhưng nó không thành công trong trình xử lý đã có. Dường như trình duyệt (Chrome 57) không thể parsekeyPath (trong Basic Concepts) bộ nhớ của tôi.Đường dẫn khóa không hợp lệ trong IndexedDB: hạn chế?

Tôi đang theo dõi nhiều ví dụ đơn giản sau: MDN hoặc Opera-Dev.

Giả sử tôi muốn lưu trữ đối tượng như thế này trong DB:

{ 
    "1": 23, // the unique id 
    "2": 'Name', 
    "3": 'Description', 
    "4": null, 
    "5": null 
} 

Đây là mã:

var sStoreNodes = 'nodes'; 
var sIdFieldNode = '1'; // the important part 

// event is fired for creating the DB and upgrading the version 
request.onupgradeneeded = function(event) 
{ 
    var db = event.target.result; 

    // Create an objectStore for nodes. Unique key should be the id of the node, on property 1. 
    // So ID will be the key! 
    var objectStore = db.createObjectStore(
     sStoreNodes, 
     { 
      // changing to a plain string works, if it is a valid identifier and not just a strigified number 
      'keyPath'  : [ sIdFieldNode ], 
      'autoIncrement' : false // really important here 
     }); 
}; 

Thông báo lỗi đọc như:

của router DOMException : Không thể thực thi 'createObjectStore' trên 'IDBDatabase': Tùy chọn keyPath không phải là một đường dẫn khóa hợp lệ. tại IDBOpenDBRequest.CCapIndexedDB.request.onupgradeneeded

Tôi cũng có thể cố gắng bỏ qua con đường quan trọng, nhưng tôi tự hỏi tại sao điều này xảy ra và muốn tôi có thể làm gì về nó, nếu tôi thực sự cần phải sử dụng một (phức tạp) đường dẫn quan trọng.

Về spec:

Tôi không chắc chắn, cho dù this thể được áp dụng ở đây:

Một giá trị được cho là một chìa khóa hợp lệ nếu nó là một trong những ECMAScript sau [ECMA -262] loại: Số nguyên giá trị, Chuỗi giá trị nguyên thủy, Đối tượng ngày hoặc Đối tượng mảng.

và những gì this thực sự có nghĩa là:

Nếu đường dẫn chính là một DOMString, giá trị [để nhận được đường key] sẽ là một DOMString bằng con đường trọng điểm. Nếu đường dẫn chính là một chuỗi, giá trị sẽ là một mảng mới, được điền bằng cách nối các chuỗi bằng với mỗi DOMString trong chuỗi.


Sửa này hoạt động, nếu bạn không sử dụng một số chuyển đổi thành chuỗi, nhưng một chuỗi thay vào đó, mà là một định danh hợp lệ (bắt đầu với một nhân vật [a-zA-Z]). Vì vậy, 'keyPath' : 'b' là OK. Tôi đoán đây là vì giá trị này được sử dụng để tạo đường dẫn như a.b.c.

Trả lời

2

Here is the definition of a key path, from the spec:

Một con đường chính là một DOMString hoặc chuỗi xác định làm thế nào để trích xuất một chìa khóa từ một giá trị. Đường dẫn khóa hợp lệ là một trong:

  • DOMString trống.
  • Mã định danh, là một DOMString khớp với sản phẩm IdentifierName từ Đặc tả ngôn ngữ ECMAScript [ECMA-262].
  • Một DOMString bao gồm hai hoặc nhiều số nhận dạng được phân tách bằng dấu chấm (mã ký tự ASCII 46).
  • Chuỗi không trống chỉ chứa DOMStrings phù hợp với các yêu cầu ở trên.

Đối với chuỗi chứa số nguyên, rõ ràng tùy chọn thứ nhất, thứ ba và thứ tư không áp dụng. Thứ hai, chúng ta phải xem what an IdentifierName is, một chút phức tạp, nhưng về cơ bản nó phải bắt đầu bằng một ký tự, dấu gạch dưới hoặc ký hiệu đô la. Điều này có nghĩa là một chuỗi chỉ chứa một số nguyên không phải là một đường dẫn khóa hợp lệ.

Nếu bạn thực sự có đối tượng trong đó khóa chính nằm trong trường có tên là chuỗi chứa số nguyên, bạn có thể đổi tên trường hoặc không sử dụng đường dẫn khóa (trong trường hợp này bạn phải chỉ định khóa bằng tay làm đối số thứ hai cho IDBObjectStore.addIDBObjectStore.put).

Bạn liên quan đến the definition for a key, trong đó xác định các giá trị hợp lệ mà một chìa khóa có thể có (như cho một đối tượng {a: 1} nơi con đường quan trọng là 'a' phím là 1, có hiệu lực).

other thing you linked to là về các đường dẫn chính như a.b.c tham chiếu {a: {b: {c: 1}}}.

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