2012-03-16 2 views
1

Я пытаюсь настроить хранилище indexeddb для использования в chrome. Но я получаю Uncaught TypeError, когда пытаюсь создать транзакцию READ_WRITE.Uncaught TypeError: введите ошибку в Chrome при использовании indexedDB

Я не смог найти хорошую, актуальную информацию об использовании webkitIDB. Поэтому я в основном летаю здесь. Любые идеи, что я сделал неправильно? Есть ли там хорошие вещи, которые я пропустил?

Установка:

function OfflineStorage() { 
    this.saveJSONString = __bind(this.saveJSONString, this); 
    var request, 
    _this = this; 
    this.dbkeyRange = window.webkitIDBKeyRange; 
    this.dbTransaction = window.webkitIDBTransaction; 
    this.db = window.webkitIndexedDB; 
    request = this.db.open("lucidFrog"); 
    request.onsuccess = function(e) { 
    _this.db = e.target.result; 
    return _this.setupDB(); //setupDB() ensures the objectStores have been created. 
    }; 
}  

Сохранить Функция:

OfflineStorage.prototype.saveJSONString = function(objectStore, json_string, obj_id) { 
    var request, store, transaction; 

    //PROBLEM AREA, gives "Uncaught TypeError: Type error" 
    transaction = this.db.transaction([objectStore], this.dbTransaction.READ_WRITE, 0); 
    //////////////////// 

    store = transaction.objectStore(objectStore); 
    request = store.put({ 
    "json": json_string, 
    "id": obj_id 
    }); 
    request.onsuccess = function(e) { 
    return console.log("YYYYYYEEEEEAAAAAHHHHHH!!!"); 
    }; 
}; 

Запрашиваемый objectStore был создан, и подтвердил, что this.dbTransaction определяется.

+0

Мне нравится думать о себе как о квалифицированном специалисте IndexedDB, и я буду рад помочь. Во-первых, является ли 'objectStore' var вы передаете строку или ссылку на фактическое хранилище объектов, такое как объект, возвращенный при создании объектаStore? – buley

+0

'objectStore' передается как строка. –

ответ

5

Это не ошибка IndexedDB из хранилища объектов, а что-то в настройке. Такая ошибка возникает, когда вы передаете неправильный тип объекта вызову, поэтому я предполагал, что objectStore var не был фактически строкой.

Основано на исключении this.db не является неопределенным (иначе это будет ошибка при транзакции), транзакция является функцией (иначе это вызовет вызов не-функции). Поэтому я должен угадать, что this.dbTransaction.READ_WRITE должен возвращать 1 просто отлично (дважды проверьте это).

Поэтому я сильно подозреваю, что это ваш третий параметр, вызывающий проблемы. Я уверен, что я никогда не использовал 3-й параметр, показанный в spec (необязательный timeout), и считаю, что здесь нет необходимости, так как таймаут по умолчанию уже равен 0 (неопределенный). Можете ли вы попытаться изменить эту строку на следующую и посмотреть, работает ли она?

transaction = this.db.transaction([objectStore], this.dbTransaction.READ_WRITE);

ОБНОВЛЕНИЕ: Обратите внимание, что константы версии теперь устарели. Вместо этих числовых значений вам нужно передать строку сейчас: «readwrite», «readonly» или «versionchange».

+1

Снятие третьего параметра разрешило его. –