在indexedDB中查找和查找一个

时间:2016-04-01 21:57:00

标签: javascript angularjs indexeddb

我理解indexedDB没有findOne或者找不到函数(就像MongoDB那样),但我想要完成的就是那些函数。

我在indexedDB中有一个数据存储。我使用比较cmdline

在商店上创建了一个索引

我想在商店中找到stop_id的所有文件。多个对象可能有一个stop_id值。

我有什么:

我想欺骗一下(如果有更好的方法,请纠正我)

stop_id

然后我想用html调用:

// this function is called from html via angularjs
    $scope.findOne = function(stop_id) {
        var db;
        var request = indexedDB.open("Trans");
        request.onerror = function(event) {
            alert("Couldn't connect to Database");
        };
        request.onsuccess = function(event) {
            db = event.target.result;
            var objectStore = db.transaction("times").objectStore("times");
            var index = objectStore.index("stop_id");

            var range = IDBKeyRange.only(stop_id);

            // call something here to retrieve
            // One or All documents with the ID of stop_id
            // passed in from the html
        }
    }

我正在考虑上述方法,因为indexedDB本身不支持连接,我将希望使用本机indexeddb变通方法来实现在另一个数据存储中动态检索与id相关的额外数据。性能不是问题。两个数据存储文档都不会超过150个项目。

1 个答案:

答案 0 :(得分:0)

使用IDBIndex get或openCursor方法。

// for one
var range = IDBKeyRange.only(myId);
var getRequest = index.get(range);
getRequest.onsuccess = function(event) {
  var result = event.target.result;
  console.log(result);
};

// for multiple ...
var getRequest = index.openCursor(range);
var documentsFound = [];
getRequest.onsuccess = function(event) {
  var request = event.target;
  var cursor = request.result;
  if(!cursor) {
    console.log('no match found, or no more matches found');
    someFunction(documentsFound);
  } else {
    console.log('Found:', cursor.value);
    documentsFound.push(cursor.value);
    cursor.advance();
  }
};

如果商店中的多个对象可以具有相同的stop_id,那么请确保在onupgradeneeded处理程序中创建索引时不使用unique:true标志。