2015-05-12 5 views
0
var db = new Dexie(app.settings.unpublishedBooksDb); 
db.version(1).stores({ 
    friends: "++id,name,shoeSize" 
}); 
db.open(); 
db.close(); 

У меня есть база данных precreated IndexedDB используя код выше, а затем на другую точку зрения в приложении, нужно добавить строку в таблицу.Dexie.js не проведение .Add сделок

var db = new Dexie('myDb'); 
db.open().then(function() { 
    console.log ('opened'); //this works 
    db.friends.add({name:"Fredrik"}); //this doesnt do anything and adding a catch doesn't throw an error either 
}).finally(function() { 
    db.close(); 
}); 

Я пробовал использовать .transaction, но все тот же. Если я попытаюсь использовать консоль Chrome, я получаю сообщение об ошибке: Невозможно прочитать свойство add of undefined

ответ

0

Ваш второй экземпляр db не содержит информации о том, какие таблицы он будет содержать. Таким образом, неявное свойство таблицы (db.friends) отсутствует. На самом деле происходит то, что он бросает TypeError: невозможно прочитать свойство «добавить» неопределенного. Если вы поймаете вызов (а не просто сделаете окончательно), вы получите доступ к этому TypeError.

Что вы можете сделать, это ссылку на таблицу друзей на db.table ('friends'). Add ({name: 'Fredrik'}) вместо db.friends.add ({name: 'Fredrik'}) ,

Остерегайтесь того, что определение базы данных без указания схемы таблиц не так точно проверено и используется, поэтому я бы рекомендовал использовать его с помощью схемы, чтобы избежать других ошибок. Если вы по архитектурным соображениям по-прежнему должны сделать это по-своему, имейте в виду, что области транзакций немного отличаются, поскольку вы не можете использовать динамические неявные свойства сказки в областях транзакций, а db.table() в настоящее время не возвращает транзакционную привязку Экземпляр таблицы, если вы находитесь в области транзакций. Вы должны использовать старые транзакции API:

db.transaction('rw', 'friends', function (friends, trans) { 
    friends.put({name: 'Fredrik'}); 
}); 

... вместо:

db.transaction('rw', 'friends', function() { 
    db.friends.put({name: 'Fredrik'}); 
}); 

С наилучшими пожеланиями, Дэвид

+0

Спасибо Дэвид, что делает работу! Я просто должен создать свой собственный метод, который открывает db после определения той же схемы каждый раз, когда мне нужно, чтобы –

+0

Если нет других веских причин (я не говорю, что их не было), я бы предложил установить db в одном месте и всегда использовать один и тот же экземпляр. Несмотря на то, что он определяет схему в уже открытой базе данных, это не повредит - она ​​не попытается воссоздать индексы - она ​​выяснит, создается ли db или нет, и при необходимости создавайте таблицы и индексы. Если вы используете несколько экземпляров db, не забудьте закрыть их, когда закончите. В противном случае у вас будут подключения к db, которые могут заблокировать другой db от обновления или удаления. –

Смежные вопросы