Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

erro 'IDBObjectStore'

Boa tarde ao tentar compilar o código mostrado na aula no console ele apresenta este erro DOMException: Failed to execute 'add' on 'IDBObjectStore' e quando eu clico ele me aponta para o meu add

o comando

ConnectionFactory.getConnection().then(connection => new NegociacaoDao(connection).adiciona(new Negociacao(new Date(), 7, 100)));

o erro:

Uncaught (in promise) DOMException: Failed to execute 'add' on 'IDBObjectStore': The object store uses out-of-line keys and has no key generator and the key parameter was not provided.
    at http://localhost:3000/js/app/dao/NegociacaoDao.js:17:18
    at new Promise (<anonymous>)
    at NegociacaoDao.adiciona (http://localhost:3000/js/app/dao/NegociacaoDao.js:11:16)
    at <anonymous>:1:84

o código do meu negociação dao

class NegociacaoDao {

    constructor(connection) {

        this._connection = connection;
        this._store = 'negociacoes';
    }

    adiciona(negociacao) {

        return new Promise((resolve, reject) => {

            let request = this
                ._connection
                .transaction([this._store],"readwrite")
                .objectStore(this._store)
                .add(negociacao);

            request.onsuccess = (e) => {

                resolve();
            };

            request.onerror = e => {

                console.log(e.target.error);
                reject('Não foi possível adicionar a negociação');
            };                
        });
    }
}

testei no edge e no fire fox e em nenhum deles funcionou

7 respostas

Fala ai Henrique, tudo bem? Acho que o problema pode ser em relação a "chave primária" de cada registro, parece que você precisaria informar ela manualmente, talvez o Negociacao iria precisar ter um id (caso não tenha).

Para tentar resolver o problema, vamos tentar pedir para o próprio IndexedDB criar esse identificador único para cada registro.

No lugar onde você cria os objetos, tente adicionar esse parâmetro: { autoIncrement: true }.

Seria algo mais ou menos assim:

db.createObjectStore("nome_da_store", { autoIncrement : true });

Espero ter ajudado.

Perdão não consegui entender direito onde eu deveria inserir este código você poderia me mostrar o código com essa parte já inclusa? caso você precise do projeto completo ele esta aqui: https://github.com/Kadugrizzo/Javascriptadv

Fala Henrique, eu dei uma olhada no projeto final do curso, parece que essa opção de autoIncrement ja estava setada, confirma se no seu ConnectionFactory, dentro da função _createStores, tem a criação das stores com essa opção:

static _createStores(connection) {
        stores.forEach(store => {
            if (connection.objectStoreNames.contains(store)) connection.deleteObjectStore(store);
            connection.createObjectStore(store, { autoIncrement: true});
        });
}

Caso tenha, vou pedir para você compartilhar seu projeto atual comigo, assim consigo simular o problema por aqui e analisá-lo com mais calma. Pode compartilhar através do Github ou Google Drive (zipado).

Espero ter ajudado.

Sim o meu connection factory já possui autoincrement setado o projeto ta aqui: https://github.com/Kadugrizzo/Javascriptadv muito obrigado por ajudar esse problema tem persistido e eu não sei oque fazer

Quais os passos para acontecer o problema Henrique? Testei o projeto aqui e funcionou certinho.

Me manda os passos que está fazendo, para eu repetir aqui e visualizar o problema.

Fico no aguardo.

quando eu executo esse comando no console :

ConnectionFactory.getConnection().then(connection => new NegociacaoDao(connection).adiciona(new Negociacao(new Date(), 7, 100)));
solução!

Fala Henrique, dei uma olhada por aqui, uma das maneiras de resolver o problema seria você passar uma chave para identificar o registro que está sendo salvo.

Podemos fazer isso no NegociacaoDao dentro do método adiciona:

adiciona(negociacao) {
    return new Promise((resolve, reject) => {
      let request = this._connection
        .transaction([this._store], "readwrite")
        .objectStore(this._store)
        .add(negociacao, Math.random());

      request.onsuccess = e => {
        resolve();
      };

      request.onerror = e => {
        console.log(e.target.error);
        reject("Não foi possível adicionar a negociação");
      };
    });
  }

Repare na função add do objectStore, como segundo parâmetro ele está gerando um número randômico que será a chave de cada registro.

Isso poderia ser um UUID ao invés de Math.random.

Espero ter ajudado.