Подсчет количества записей в хранилище объектов в indexedDB

Я хочу подсчитать количество записей в моей базе данных indexedDB.

в настоящее время мой код выглядит так:

в JavaScript

var transaction = db.transaction(["data"], "readonly");
var objectStore = transaction.objectStore("data");
var cursor = objectStore.openCursor();  
    var count = objectStore.count();
    console.log(count); 

Я бы хотел, чтобы это говорило о выходе только 3, но вместо этого я получаю.

выход

        IDBRequest {onerror: null, onsuccess: null, readyState: "pending", transaction: IDBTransaction, source: IDBObjectStore…}
    error: null
    onerror: null
    onsuccess: null
    readyState: "done"
    result: 3
    source: IDBObjectStore

transaction: IDBTransaction
__proto__: IDBRequest

что правильно, но я просто хочу, чтобы он сказал 3 не много других вещей.

3 ответов


немного введения в порядок. От моего личные документы по сделкам:

некоторые операции возвращают данные, или "результаты", из базы данных. Эти транзакции называются "запросами" и за исключением открытие базы данных, значения всегда различные комбинации объектов "ключи" и "значения" и экземпляры IDBRequest. Запрос транзакций это просто: запрос транзакции", а именно акт запроса что-то вместо того, чтобы получить его. Программист встречает их при работе с объектами IDBObjectStore, IDBIndex или IDBCursor.

то, что вы смотрите на IDBRequest объект, который возвращается count() метод. Это представляет собой запрос данных, а не сами данные.

сами данные доступны после complete событие, и могут быть доступны через IDBRequest.result собственность.

вот проверенный метод подсчета от мой библиотека, тире:

API.entries.count = function (count_ctx) {
  var request;
  if (API.exists(count_ctx.index)) {
    count_ctx.idx = count_ctx.objectstore.index(count_ctx.index);
    request = API.isEmpty(count_ctx.key) ? count_ctx.idx.count() : count_ctx.idx.count(count_ctx.key);
  } else {
    request = API.isEmpty(count_ctx.key) ? count_ctx.objectstore.count() : count_ctx.objectstore.count(count_ctx.key);
  }

  count_ctx.transaction.addEventListener('error', function (event) {
    count_ctx.error = event.target.error.message;
    API.error(count_ctx);
  });

  request.addEventListener('success', function () {
    count_ctx.total = request.result;
    API.success(count_ctx);
  });

я отмечу, что я, вероятно, должен был использовать complete событие, а не success событие. Я не могу объяснить, почему, но иногда значения результатов недоступны в success обратные вызовы.


вернуть количество записей с немного меньше кода:

var store = db.transaction(['trans']).objectStore('trans');
var count = store.count();
count.onsuccess = function() {
    console.log(count.result);
}

попробуйте что-то вроде этого:

var transaction = db.transaction(["data"], "readonly");
var objectStore = transaction.objectStore("data"); 
var count = objectStore.count();

count.onsuccess = function() {
    console.log(count.result);
};