Получить все данные из indexedDB несколькими ключами - PullRequest
0 голосов
/ 29 февраля 2020

Как я могу получить данные из indexedDB двумя или более ключами? Например у меня есть images_store с image_code в качестве индекса. Скажем, у меня есть:

image_code | image_value
img_aaa000 | ###########
img_bbb111 | #######$$.#
img_ccc222 | ###5%######
img_ddd333 | #.###***###

Я хочу получить данные для кодов изображений "img_bbb111" и "img_ddd333", как когда я запрашиваю их у SQL:

SELECT * FROM images_store WHERE image_code IN ("img_bbb111","img_ddd333");

Спасибо!

1 Ответ

1 голос
/ 29 февраля 2020

Вам необходимо выполнить несколько запросов. Оператор SQL IN по сути является синтактическим c сахаром для image_code = a or image_code = b. Проблема заключается в использовании or здесь. indexedDb не поддерживает что-то вроде or. Поэтому вам нужно выполнить запрос для img_bbb111, за которым следует второй запрос для img_ddd333, а затем объединить результаты двух запросов.

Примерно так:

function myOnUpgradeNeeded(event) {
   const imageStore = db.createObjectStore('images_store', ...);
   imageStore.createIndex('image_code_index', 'image_code');
}

function findImagesForCodes(db, codes) {
  return new Promise((resolve, reject) => {
    const transaction = db.transaction('images_store');
    const store = transaction.objectStore('images_store');
    const codeIndex = store.index('image_code_index');

    const results = [];

    transaction.oncomplete = event => resolve(results);
    transaction.onerror = event => reject(event.target.error);

    for (const code of codes) {
      const request = codeIndex.get(code);
      request.onsuccess = onRequestSuccess;
    }

    function onRequestSuccess(event) {
      const image = event.target.result;
      if(image) {
        results.push(image);
      }
    }
  });
}
...