【问题标题】:What is the correct way to use localForage with Cordova?将 localForage 与 Cordova 一起使用的正确方法是什么?
【发布时间】:2018-04-10 19:53:40
【问题描述】:

我正在尝试使用localForagelocalForage-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);
});

在我看来,它应该将 It works! 打印到控制台。

【问题讨论】:

    标签: javascript cordova localforage cordova-sqlite-storage


    【解决方案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.');
        }
    });
    

    【讨论】:

    • 谢谢,非常感谢!我花了一天时间试图弄清楚这一点......文档确实需要更新以解释生命周期,或者至少给出一个这样的例子^^
    猜你喜欢
    • 2020-01-07
    • 2013-01-02
    • 1970-01-01
    • 2020-08-27
    • 2020-07-10
    • 2020-09-29
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多