2014-12-31 3 views
0

Я действительно могу использовать некоторую помощь по моему коду. Я использую индексированной в моем веб-приложение, и я создал два в ObjectStore: - companyToCall - companyCalledНе удается удалить объект в IndexedDB с помощью ключа auto_increment

Оба содержат объекты Компании (пользовательский класс в JS я сделал). Здесь идет схема:

databaseOpeningRequest.onupgradeneeded = function(event) 
{ 
    db = event.target.result; 
    db.createObjectStore('companyToCall', { autoIncrement: true }).createIndex("id", "id", { unique: true}); 
    db.createObjectStore('companyCalled', { autoIncrement: true }).createIndex("id", "id", { unique: true}); 
} 

Я решил не использовать Company.id в качестве ключа в БД, потому что я хотел, чтобы запомнить порядок включения в базу данных, например, вставить впоследствии компании с идентификатором 25 20 и 30 в дБ, я хочу, чтобы их ключи были такими: компания 25 -> 1/компания 20 -> 2/компания 30 -> 3

Все эти компании впервые вставляются в хранилище CompanyToCall и когда я Я работаю с одним, я хочу поместить его в хранилище CompanyCalled и удалить его из хранилища CompanyToCall.

К сожалению, удаление в хранилище CompanyToCall не будет работать, и я не могу понять, почему. Вот исключение:

var removeCompanyFromToCallStorage = function(company) 
{ 
    if (activateLocalStorage) 
    { 
     var requete = db.transaction(['companyToCall'], 'readwrite').objectStore('companyToCall').delete(company.getId()); 
     requete.onsuccess = function(e) 
     { 
      console.log('worked'); 
     }; 
    } 
}; 

я получил «работал» на моей консоли, но когда я проверяю дб я все еще могу видеть эту компанию в неправильном хранении (после обновления и т.д. и т.п.)

Кто-нибудь есть идеи?

ответ

1

Во-первых, вам нужно указать путь к ключам при создании хранилищ объектов, чтобы ссылаться на объекты по идентификатору. Путь ключей подобен первичному ключу записи в обычной реляционной таблице. Использование ключевого пути необязательно. В настоящее время у вас нет первичного ключа, поэтому выполнение операции удаления по первичному ключу без указания того, какое поле в объекте представляет первичный ключ, не имеет смысла. Вы можете определить путь к ключу, изменив db.createObjectStore('companyToCall', { autoIncrement: true })... на db.createObjectStore('companyToCall', {keyPath: 'id', autoIncrement: true}).... См. IDBDatabase.createObjectStore для получения дополнительной информации.

Во-вторых, IDBObjectStore.prototype.delete запускает событие успеха независимо от того, был ли изменен объект в хранилище объектов. Многие операции в indexedDB запускают события успеха независимо от того, что на самом деле произошло. В основном успех просто означает, что вы правильно запросили операцию, которая будет выполнена, и что операция завершена. Это не означает, что операция сделала что-то. Поэтому «работа» всегда отображается в консоли. К сожалению, нет простого способа определить, действительно ли объект был удален. Вместо того, чтобы «работать», вы можете печатать только что-то вроде «успешно запрошенного объекта, который нужно удалить», но вы никогда не узнаете, действительно ли запрос сделал что-либо, если вы не создали более поздний запрос на его проверку.

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