2013-11-20 3 views
7

Я не знаю, прав я или нет. Но, как я знаю, я не могу создать транзакцию с изменением версии вручную. Единственный способ вызвать это - изменить номер версии при открытии индексированного соединения БД. Если это правильно, в примере1 и example2 новый объектStore никогда не будет создан?Как создать несколько хранилищ объектов в IndexedDB

Example1

function createObjectStore(name){ 
    var request2 = indexedDB.open("existingDB");  
    request2.onupgradeneeded = function() { 
     var db = request2.result; 
     var store = db.createObjectStore(name); 
    }; 
} 

Example2

function createObjectStore(name){ 
    var request2 = indexedDB.open("existingDB");  
    request2.onsuccess = function() { 
     var db = request2.result; 
     var store = db.createObjectStore(name); 
    }; 
} 

Example3 - Это должно работать:

function createObjectStore(name){ 
    var request2 = indexedDB.open("existingDB", 2);  
    request2.onupgradeneeded = function() { 
     var db = request2.result; 
     var store = db.createObjectStore(name); 
    }; 
} 

Если я хочу создать множественным ObjectStore это в одной базе данных, как я могу получить/выбрать версию базы данных до открытия базы данных? Итак, есть способ автоматизировать этот процесс получения номера версии базы данных?

Есть ли другой способ создать объектStore, отличный от этого, используя обработчик события onupgradeneededed.

Пожалуйста, помогите. Большое спасибо.

Edit:

Вот та же проблема, что у меня есть: https://groups.google.com/a/chromium.org/forum/#!topic/chromium-html5/0rfvwVdSlAs

ответ

13

Вам необходимо открыть базу данных, чтобы проверить ее текущую версию и снова открыть ее с помощью version + 1, чтобы вызвать обновление. Вот пример кода:

function CreateObjectStore(dbName, storeName) { 
    var request = indexedDB.open(dbName); 
    request.onsuccess = function (e){ 
     var database = e.target.result; 
     var version = parseInt(database.version); 
     database.close(); 
     var secondRequest = indexedDB.open(dbName, version+1); 
     secondRequest.onupgradeneeded = function (e) { 
      var database = e.target.result; 
      var objectStore = database.createObjectStore(storeName, { 
       keyPath: 'id' 
      }); 
     }; 
     secondRequest.onsuccess = function (e) { 
      e.target.result.close(); 
     } 
    } 
} 
+0

Спасибо за ответ. Это может сработать. Но мне кажется, что это «глупо», а не программный способ открыть базу данных дважды:/ – user1598696

+0

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

+0

Я не понимаю, почему вы хотите узнать версию бета-версии? вы знаете, в какой версии вам нужно открыть базу данных. если версия не соответствует той версии, которую вы предоставили, она даст вам способ обновить вашу базу данных. В этом случае вы узнаете, из какой версии вам нужно обновиться. –

4

Единственный путь вы можете создать хранилище объект находится в onupgradeneeded случае. Для изменения схемы требуется транзакция version_change. И единственный способ получить транзакцию version_change - через событие onupgradedededededededededededed.

Единственный способ запуска события onupgradeneeded - открыть базу данных в более высокой версии, чем текущая версия базы данных. Лучший способ сделать это - сохранить константу с текущей версией базы данных, с которой вам нужно работать. Каждый раз, когда вам нужно изменить схему базы данных, вы увеличиваете это число. Затем в событии onupgradededed вы можете получить текущую версию базы данных. При этом вы можете решить, какой путь обновления вам нужно выполнить, чтобы перейти к последней схеме базы данных.

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

+0

Спасибо за ваш ответ. Мне все ясно, что вы написали, но где я буду хранить эту константу? Если я закрою браузер и снова открою его, то эта константа будет потеряна, я прав?!? И затем, когда я хочу создать новый объект, как я узнаю, какая версия базы данных у меня есть? Благодарю. – user1598696

+1

Нет, если вы просто определяете var constant = 3; он будет оставаться неизменным при каждом открытии файла. Когда вам нужна более новая версия, вы просто установите ее на 4, например –

+0

У меня есть небольшое приложение, и каждый раз, когда я загружаю файл, необходимо создать новый объектStore. Теперь я немного смущен, не могли бы вы объяснить, пожалуйста, или привести небольшой пример. Если у меня есть постоянная версия var = 2; а затем у меня есть автоматическая загрузка более 100 файлов. Таким образом, необходимо создать более 100 объектов. Каков тогда правильный способ сделать это? – user1598696

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