Правильный способ добавить несколько объектов в indexedDb? - PullRequest
0 голосов
/ 14 января 2019

У меня есть следующий массив объектов, которые я хочу добавить и indexedDb:

const data = [
    { name: 'abc',
      color: 'blue'
    },
    { name: 'xyz',
      color: 'red'
    },
    { name: 'yui',
      color: 'black'
    }];

Теперь я создаю базу данных и вставляю эти данные в хранилище так:

if (!db.objectStoreNames.contains("people")) {
        peopleStore = db.createObjectStore("people", { keyPath: "name" });
        peopleStore.createIndex("color", "color", { unique: false });

        peopleStore.transaction.oncomplete = function(event) {
            data.forEach(function(data) {
                operations.add(data);
            });
        };
    }

Я определил выражение функции с помощью метода add() (внутри const operations), как показано ниже:

add: function(data) {
            let request = db
                .transaction(["people"], "readwrite")
                .objectStore("people")
                .add(data);
        }

Итак, вот мои вопросы:

  1. Этот способ создает новую транзакцию каждый раз, когда метод add () вызывается или он вставляет все данные в одну транзакцию?

  2. Если он создает новую транзакцию каждый раз, как я могу сделать только 1 транзакция для повышения производительности и выполнения всех операций в это только. Я предполагаю, что мне нужно создать глобальную переменную с выполнить транзакцию и выполнить над ней операции (есть и другие методы, такие как edit(), delete() и т. д., каждый из которых имеет переменную "request", определяющую транзакцию, аналогично тому, что я показал) выше). Должен ли я сделать глобальную переменную что-то вроде этого:

const globalTrans = db.transaction(["people"], "readwrite").objectStore("people");

  1. Является ли создание новой транзакции дорогостоящей операцией?

Заранее спасибо всем, кто нашел время, чтобы ответить! :)

1 Ответ

0 голосов
/ 14 января 2019

Создание глобальной переменной создаст проблему. Возможно, транзакция выполняется и для другой операции вы можете перезаписать ее.

например -

var globalTx;
// let's say you are selecting data from people
globalTx = db.transaction(["people"], "read")  // in read access
// and at same time you are inserting data from employee
globalTx = db.transaction(["employee"], "readwrite") // in read write

Есть много способов решить проблему -

  1. Создание нескольких методов на основе сценария -
// for single value
function add(data) {
    let request = db.transaction(["people"], "readwrite").objectStore("people").add(data);
}
// for multiple value
function addMultiple(data, callback) {
    const tx = db.transaction(["people"], "readwrite");

    data.forEach(value => {
        let request = tx.objectStore("people").add(data);
    })

    tx.oncomplete = function(event) {
        callback();
    }
};
  1. Изменение функции для получения только значений массива -
// so now data will be only array    
function add(data, callback) {
    const tx = db.transaction(["people"], "readwrite");

    data.forEach(value => {
        let request = tx.objectStore("people").add(data);
    })

    tx.oncomplete = function(event) {
        callback();
    }
};

// so when want to insert single value , we will call like this.

const value = {
    id: 1,
    name: 'ujjwal'
}
add([value], () => {

})

Надеюсь, это ответит на ваш вопрос.

...