Vue.js + Dexie: импорт как модуль с настраиваемыми функциями
У меня есть рабочий Vue.js с базой данных Dexie IndexedDB, который работает плавно следующим образом: Везде, где во Vue мне нужен доступ к базе данных, я импортирую модуль:
import db from '@/services/MyIdb'
И я могу напрямую получить доступ к методам Dexie, например:
db.table(tableName).clear()
Модуль, MyIdb.js
настроен следующим образом (я удалил код и таблицы для упрощения):
import Dexie from 'dexie'
const db = new Dexie('myDatabase')
const idb_schema_old = { myTable: '&key', }
const idb_schema = { myTable: '&key', }
const db_version_old = 9
const db_version = 10
// NEW VERSION
db.version(db_version_old).stores(idb_schema_old)
db.version(db_version).stores(idb_schema)
db.open().then(function(){
// Success
}).catch(Dexie.UpgradeError, function (e) {
// Failed with UpgradeError
console.error ("Upgrade error: " + e.message)
console.log("Dropping database and installing latest version")
db.delete()
db.version(db_version).stores(idb_schema)
db.open().catch(function (err) {
console.error (err.stack || err);
})
}).catch(Error, function (e) {
// Any other error derived from standard Error
console.error ("Error: " + e.message);
}).catch(function (e) {
// Other error such as a string was thrown
console.error (e);
});
export default db;
Все хорошо. Но теперь я хотел бы иметь возможность вызывать инициализацию из произвольной точки в программе (есть кнопка для сброса и перезагрузки базы данных). Таким образом, примерно так:
import Dexie from 'dexie'
const db = new Dexie('myDatabase')
const idb_schema_old = { myTable: '&key', }
const idb_schema = { myTable: '&key', }
const db_version_old = 9
const db_version = 10
init() {
// NEW VERSION
db.version(db_version_old).stores(idb_schema_old)
db.version(db_version).stores(idb_schema)
db.open().then(function(){
// Success
}).catch(Dexie.UpgradeError, function (e) {
// Failed with UpgradeError
console.error ("Upgrade error: " + e.message)
console.log("Dropping database and installing latest version")
db.delete()
db.version(db_version).stores(idb_schema)
db.open().catch(function (err) {
console.error (err.stack || err);
})
}).catch(Error, function (e) {
// Any other error derived from standard Error
console.error ("Error: " + e.message);
}).catch(function (e) {
// Other error such as a string was thrown
console.error (e);
});
}
export default db;
Теперь инициализация - это функция, которую я хотел бы назвать чем-то вроде db.init(). Приведенный выше код неверен и не работает. Но как реализовать что-то подобное, где я мог бы вызвать функцию типаdb.init()
или something.init()
На протяжении всей моей программы я уже import db
и вызывать методы Dexie, я бы предпочел не переписывать все это.
1 ответ
Я думаю, что этот код неверно интерпретирует то, как Декси работает с обновлениями. Вам не нужно перехватывать UpgradeError и повторно инициализировать базу данных. Вы просто объявляете версию, которую используете, и Декси обновит базу данных при необходимости. В Dexie 3 вам также не нужно хранить старые версии схемы в коде, см. Обработка версий.
Кажется, вам нужно действие для удаления и воссоздания базы данных. Это должно быть сделано с помощью Dexie.delete() с последующим новым вызовом db.open (). Вы также можете использовать Table.clear для всех таблиц, но автоматически увеличивающиеся ключи не будут сброшены, и нет возможности изменить схему в этой операции.
async function recreateDatabase(db) {
await db.delete();
await db.open();
}
Вот также пример jsitor, который выполняет db.delete(), за которым следует db.open().