indexeddb 部分键搜索 get next

indexeddb partial key search get next

在我调用 cursor.continue() 之前,indexeddb CursorWithValue 是否存储了下一条或上一条记录?我可以查看 IDBCursorWithValue 对象,然后将指针存储到下一条记录吗?

是否可以通过部分键获取第一条记录,然后仅在用户单击下一条记录时获取下一条记录,而不用缓冲数组中的记录集合?

我知道我可以使用 cursor.continue() 来获取所有匹配的记录并存储在一个数组中。我也明白异步,如果我只获取第一个匹配的记录,并终止我的 onsuccess 函数,那么对数据库的调用就会终止,我很确定我会失去 link 的能力到下一条记录。

以下工作,我可以得到部分键的一条或所有匹配记录。使用 \uffff 我基本上得到匹配的 alpha 和所有更大的记录。

storeGet = indexTITLE.openCursor(IDBKeyRange.bound(x.value, x.value, '\uffff'), 'next');

这对我来说是全新的,也许我看错了。任何建议表示赞赏。我一直在阅读这里的每个线程,并且 github 我可以,希望其他人已经在用 indexeddb 这样做了。

让我试着重述一下问题:

You've iterated a cursor part-way through a range. Now you want to stop and wait for user input before continuing. But the transaction will close, so you can't just continue on the click. What do you do instead?

首先:好问题!这很棘手。您有几个不同的选择。

在最简单的情况下,您有一个唯一索引(或对象存储),因此没有重复键。

var currentKey = undefined;

// assumes you open a transaction and pass in the index to query
function getNextRecord(index, callback) {
  var range;
  if (currentKey === undefined) {
    range = null; // unbounded
  } else {
    range = IDBKeyRange.lowerBound(currentKey, true); // exclusive
  }
  var request = index.openCursor(range);
  request.onsuccess = function(e) {
    var cursor = request.result;
    if (!cursor) {
      // no records found/hit end of range
      callback();
      return;
    }
    // yay, found a record. remember the key for next time
    currentKey = cursor.key;
    callback(cursor.value);
  };
}

如果你有一个非唯一索引,那就更棘手了,因为你需要存储索引键和主键,而且没有办法在那个位置打开游标。 (请参阅功能请求:https://github.com/w3c/IndexedDB/issues/14)因此您需要将光标向前移动到刚好超过之前看到的 key/primaryKey 位置:

var currentKey = undefined, primaryKey = undefined;

// assumes you open a transaction and pass in the index to query
function getNextRecord(index, callback) {
  var range;
  if (currentKey === undefined) {
    range = null; // unbounded
  } else {
    range = IDBKeyRange.lowerBound(currentKey, true); // exclusive
  }
  var request = index.openCursor(range);
  request.onsuccess = function(e) {
    var cursor = request.result;
    if (!cursor) {
      // no records found/hit end of range
      callback();
      return;
    }

    if (indexedDB.cmp(cursor.key, currentKey) === 0 &&
        indexedDB.cmp(cursor.primaryKey, primaryKey) <= 0) {
      // walk over duplicates until we are past where we were last time
      cursor.continue();
      return;
    }

    // yay, found a record. remember the keys for next time
    currentKey = cursor.key;
    primaryKey = cursor.primaryKey;
    callback(cursor.value);
  };
}

我假设没有上限,例如我们想要索引中的所有记录。可以酌情替换range的初始化