Как правильно использовать localForage с Cordova?

Я пытаюсь использовать localForage с https://github.com/thgreasi/localForage-cordovaSQLiteDriver для настройки постоянного хранилища в приложении cordova. Это не работает, и я продолжаю получать следующие записи в консоли:

новая транзакция ожидает открытой операции

Я не уверен, что понимаю localforage Жизненный цикл правильно. Вот что у меня есть:

// 1) setup cordova SQL lite driver
localforage.defineDriver(window.cordovaSQLiteDriver).then(function() {

    // 2) set preferred driver order
    return localforage.setDriver([
        window.cordovaSQLiteDriver._driver, // <-- prefer cordovaSQLiteDriver
        localforage.INDEXEDDB,
        localforage.WEBSQL,
        localforage.LOCALSTORAGE
    ]);
})
.then(function() {
    // 3) wait for localForage to be ready
    return localforage.ready();
})
.then(function() {

    // 4) create a globally scoped app database
    window.appStorage = localforage.createInstance({
        version: 1.0,
        size: 52428800, // 50mb
        name: 'my-app-name',
        storeName: 'setup'
    });

    // 5) check if we're using cordova sql lite
    if (localforage.driver() !== window.cordovaSQLiteDriver._driver) {
        console.warn('Not using cordovaSQLiteDriver.');
    }

    // 6) write something
    return appStorage.setItem('message', 'It worked!'); // <-- only it doesn't 
})
.then(function() {
    // 7) get the value back out of the database
    return appStorage.getItem('message');
})
.then(function(message){
    // 8) write the value to the console
    console.log(message);
});

На мой взгляд, это должно быть печать Это сработало! на консоль.

1 ответ

Решение

Итак, прежде всего, createInstance() возвращает совершенно новый и не связанный экземпляр localforage и реинициализируется с нуля. Поэтому новый экземпляр будет пытаться определить, какой драйвер использовать, используя порядок предпочтений драйвера по умолчанию (IndexedDB, WebSQL, LocalStorage). Единственное, что разделяют все экземпляры localforage - это доступные / определенные драйверы. Так что вы можете сделать что-то вроде этого:

localforage.defineDriver(window.cordovaSQLiteDriver).then(function() {
    window.appStorage = localforage.createInstance({
        version: 1.0,
        size: 52428800, // 50mb
        name: 'my-app-name',
        storeName: 'setup',
        driver: [
            window.cordovaSQLiteDriver._driver, // <-- prefer cordovaSQLiteDriver
            localforage.INDEXEDDB,
            localforage.WEBSQL,
            localforage.LOCALSTORAGE
        ]
        // OR instead of passing the `driver` option,
        // you can call `window.appStorage.setDriver()`
        // right after `createInstance()`
    });

    if (window.appStorage.driver() !== window.cordovaSQLiteDriver._driver) {
        console.warn('Not using cordovaSQLiteDriver before setItem.');
    }

    return appStorage.setItem('message', 'It worked!');
})
.then(function() {
    return appStorage.getItem('message');
})
.then(function(message){
    console.log(message);
    if (window.appStorage.driver() !== window.cordovaSQLiteDriver._driver) {
        console.warn('Not using cordovaSQLiteDriver after setItem.');
    }
});
Другие вопросы по тегам