将 localForage 与 Cordova 一起使用的正确方法是啥?

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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.');
    
);

【讨论】:

谢谢,非常感谢!我花了一天时间试图弄清楚这一点......文档确实需要更新以解释生命周期,或者至少给出一个这样的例子^^

以上是关于将 localForage 与 Cordova 一起使用的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 localforage 迭代显示或映射到 html 元素 <p>

突破本地离线存储的JS库 localforage

使用 $localForage.setItem 时,应用程序会冻结几秒钟

localforage调用setItem时出现DOMException错误的解决方法

页面缓存离线存储技术localforage(介绍篇)

Vue中 引入使用 localforage 改进本地离线存储(突破5M限制)