Проверьте, содержит ли IndexedDB objectStore ключ

добавление объекта в IndexedDB objectStore завершится ошибкой, если ключ уже существует. Как я могу проверить наличие объекта с заданным ключом-желательно синхронно (нет причин для другого уровня обратных вызовов) и без вытягивания объекта.

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

Примечание решение должно работать только в Chrome (если это поможет)

4 ответов


до сих пор ни в одном из браузеров не реализован API синхронизации, поэтому вам придется делать это асинхронно. Ан objectStore предоставляет get метод, который вы предоставляете ему ключ, и он вернет вам объект (или null), который соответствует ключу.

есть действительно хороший учебник по MDN, который охватывает использование IDB и начало записи также покрыто, но встроенный код:

db.transaction("customers").objectStore("customers").get("444-44-4444").onsuccess = function(event) {
  alert("Name for SSN 444-44-4444 is " + event.target.result.name);
};

если вы не хотите получить запись, то вы всегда можете использовать count метод по индексу, как объяснено здесь в спец. Исходя из результата, вы можете либо использовать add или put чтобы изменить запись, он сохранит извлечение записи, если вам это не нужно.


лучший способ проверить наличие ключа-objectStore.граф(ключ). Это асинхронно.

в вашем случае лучшим вариантом является openCursor вашего ключа. Если существует, курсор появится.

var req = objectStore.openCursor(key);
req.onsuccess = function(e) {
  var cursor = e.target.target;
  if (cursor) { // key already exist
     cursor.update(obj);
  } else { // key not exist
     objectStore.add(obj)
  }
};

немного поздно для ответа, но возможно это поможет другим. Я все еще спотыкался -как мне кажется-над той же проблемой, но это очень просто:

если вы хотите вставить или обновить записи, которые вы используете objectStore.put(object) (справка)
Если вы хотите вставить только записи, вы используете objectStore.add(object) (справка)

если вы используете add(object), и ключ записи все еще существует в БД, он не будет перезаписан и вызывает ошибку 0 " ConstraintError: Key уже существует в объекте хранить."

Если вы используете put(object), он будет перезаписан.


вопрос в том, почему вы хотите это знать? Может, тебе стоит использовать другой подход?

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

вы также можете использовать метод put вместо метода add. С помощью put данные будут обновлены, если ключ существует, и если ключ не существует, данные добавляются.

все зависит от причины, почему вы хотите проверить, если что-то существует.