Использование IndexedDB, как SQL.Запрос с несколькими значениями индекса, которые не находятся в диапазоне - PullRequest
0 голосов
/ 19 мая 2019

В основном я хочу выбрать все значения, которые соответствуют индексу / ключу, но они не находятся в диапазоне программно.Он должен быть в состоянии выбрать диапазон запросов (как в переменном количестве за один раз).В SQL я бы сделал это следующим образом.

Select * FROM questions WHERE `id` in (2,45,17)

Но когда дело доходит до индексированного БД, мои возможности кажутся ограниченными.Я обнаружил, что могу выполнять несколько запросов последовательно, но как бы я это сделал, не зная, сколько из них будет выбрано заранее?

Вот текущий JavaScript, который я использую.Очевидно, это не работает.Я уже создал базу данных indexedDB с именем "Practice_materials", создал хранилище объектов с именем "questions", создал индекс по id и поместил в него данные.

window.idb=window.indexedDB;
     var request=indexedDB.open(db_name,db_version);
request.onerror=function(event){
    console.log('error:'+event);
}
request.onsuccess=function(event){
  db_res=request.result;
}
var tx=db_res.transaction([obj_store]).objectStore(obj_store);
var res='';     
var out_obj=[];
var id=[2,45,17];
for(i=0;i<3;++i){
    request=tx.get(id[i]);
    request.onsuccess=function(event){
    out_obj.push(request.result);
    }
}

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

https://github.com/jakearchibald/idb

Единственное, чтоВы должны создать его для своего браузера, который стоит того, чтобы иметь обещания и иметь возможность ждать, пока транзакция не завершится. (В первую очередь, при открытии базы данных, получении индексов, выборе хранилища объектов и т. д., настройка данных не имеет значения, так какмного, но все еще приятно иметь. PS Я собираюсь использовать это для системы вопросов и ответов в качестве учебного пособия для студентов по анатомии. Он будет выбирать случайное количество вопросов из каждой главы (которую я сделал) и диапазон будет от 15-25 с вопросами, которые будут выбраны случайным образом. Я бы использовал WebSQL, поскольку я, вероятно, могу сделать это намного проще, но это приветствуется.

PPS Кроме + Rep для правильного ответа Iдобавлю ссылку на этот вопрос.

1 Ответ

1 голос
/ 20 мая 2019

Нет прямого пути к эмуляции оператора SQL in. Вот два решения.

Использование Array.prototype.filter() (можно утверждать, что две строки кода довольно просты)

const filter = [2,45,17];
const fieldToFilter = "someField";
objectStore.getAll().onsuccess = function(event) {
  const filtered = event.target.result.filter(i => filter.includes(i[fieldToFilter]));
  console.log(filtered);
};

Использование курсоров IndexDB:

Атрибуция: адаптировано из: Здесь

let i = 0;
const selected = [];
const filter = [2,17,45];

myIndex.openCursor(keyRangeValue).onsuccess = function(event) {
  let cursor = event.target.result;
  if (!cursor) { // We are done
    console.log(selected); // do something with result
    return;
  } 
  var key = cursor.key;
  if (key > filter[i]) { // filter should be sorted asc
    ++i;
    if (i >= filter.length) {
      return;
    }
  }
  if (key === filter[i]) { // Use individual row
    selected.push(cursor.value); // here
    cursor.continue(); // Next
  } else {
    cursor.continue(filter[i]); // Go to the next filtered key
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...