在indexedDB中按数字/日期排序的意外行为

时间:2014-10-24 11:06:40

标签: javascript indexeddb

对于我的数据库,我在time上创建了一个名为created_at的索引:

var os = thisDB.createObjectStore(name, { keyPath :  "id" });
os.createIndex("time", "created_at", {unique: false });

如您所见,我将时间保存为unix整数:

entry['created_at'] = Date.new(entry['created_at']).unix();
var request = sto.add(entry);

所以在控制台的最后,数据看起来像这样:

enter image description here

我的问题是如何获取在ascdesc方向创建的所有数据:

因为当我用光标检查数据时:

function open_cursor(){
  var objectStore = ENTRYDB.transaction('entries').objectStore('entries').index('time');
  var request = objectStore.openCursor();
  request.onsuccess = function(event) {handle_open(event)};
}
function handle_open(evt){
  var cursor = evt.target.result;
  if (cursor) {
    console.log(cursor.value);
    cursor.continue();
  }
}

它没有按时创建排序!这是随机的!谢谢

1 个答案:

答案 0 :(得分:2)

您可以通过为openCursor函数提供第二个参数来对升序/降序进行排序:index.openCursor(undefined,“next”);或“prev”下降。

排序应该适用于索引,当您不提供next或prev(next是默认值)时也是如此。当您在索引上调用openCursor时,它会以与chrome-dev-tools在调试器中单击“time”索引时显示它们相同的方式循环它们。

你是否有机会使用垫片(可能是iOS / android)? (https://github.com/axemclion/IndexedDBShim),因为这是一个已知的问题,排序在那里并没有真正起作用。如果您不确定那么我猜这段不适用于您..

编辑你可能没有使用垫片,因为我看到chrome dev-tools的indexedDb截图,你在使用垫片时无法做到,因为它使用不同的存储机制)