2015-12-15 2 views
1

Я только что узнал об индексированныхDB, и это мое понимание настройки базы данных. Вы вызываете .open(dbName), чтобы получить экземпляр БД. Если база данных этого имени не существует на компьютере пользователя (например, если это их первый визит на сайт), это вызывает событие onUpdateNeeded, поэтому вы должны делать такие вещи инициализации, как создание ObjectStores.Почему indexedDB использует «версию»?

Теперь вы также можете передать в версии - .open(dbName, version) - и если база данных существует, но использует более низкую версию, это вынуждает событие onUpdateNeeded независимо. Теперь я вижу полезность этого ... но почему есть целочисленный аргумент? Если точкой аргумента «версия» является принудительное обновление, почему бы просто не указать флаг forceUpdate? Почему у вас есть аргумент целочисленной версии, который вам нужно постоянно увеличивать, когда вы отлаживаете свой код, предположительно достигая версии 156 после многих дней отладки?

Является ли версия, используемая в некоторых функциях, я не знаю о том, что вы просто заставляете обновления, а если нет, то в чем причина этого? Кроме того, планируете ли вы продолжать изменять версию во время разработки, но сохраните ее при выпуске приложения или идете, что вы должны постоянно менять ее на протяжении всего жизненного цикла вашего приложения?

+0

Полезно * после * вы: отправили свою программу, кто-то ее использовал, сохранили некоторые данные, и вы сделали обновление, которое хранит данные несовместимо. Конечно, для локального тестирования вы просто хотите очистить его каждый раз. – transistor09

ответ

5

монотонно возрастающая целое число позволяет схеме:

var open = indexedDB.open('db', 3); 
open.onupgradeneeded = function(e) { 
    var db = open.result; 
    if (e.oldVersion < 1) { 
    // create v1 schema 
    } 
    if (e.oldVersion < 2) { 
    // upgrade v1 to v2 schema 
    } 
    if (e.oldVersion < 3) { 
    // upgrade v2 to v3 schema 
    } 
    // ... 
}; 
open.onsuccess = function() { 
    var db = open.result; 
    // ... 
}; 

Это очень общий шаблон. Очевидно, можно предположить, что это делается вручную - разработчики могли отслеживать версию в специальной таблице метаданных, а не закреплять ее в стандарте. Но достаточно распространено, что оно было встроено, подобно индексам и генераторам ключей.

Там есть убедительный аргумент, что это делает API слишком сложным для начинающих, но без машины времени это несколько спорный вопрос.

...

Если вы отладка локально и изменения ограничены к вашей машине, то удаление/создание базы данных, вероятно, легче, чем писать логику обновления схемы для каждого незначительного изменения.

+0

У меня есть личный вопрос о последующих действиях: каждый блок условий для новой версии действительно должен мигрировать из всех возможных состояний предшествующей схемы? Где вы указываете обновление комментариев с v2 до v3, вам не обязательно всегда учитывать обновление с v1 до v3 внутри одного и того же блока? Например. обновление расширения chrome, содержащее схему db, которая прошла через несколько локальных изменений между обновлениями? – Josh

+0

Ой, я ошибся в своем примере. Это должно быть проверка oldVersion события, а не версия базы данных. Fix coming ... –

+0

Хорошо, исправление сделал - извините за то. Поскольку в операторах if нет elses, при необходимости будут выполняться несколько блоков. –

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