仅部分检索localStorage数据

时间:2012-08-06 13:48:49

标签: javascript ios cordova local-storage

我目前正在使用Phonegap 1.4.1开发移动应用。在iOS(目前使用5.1)上,应用程序不会加载localStorage的所有数据。

第一次使用该应用时,我在localStorage中设置了一个标志,如下所示:

window.localStorage.setItem("myFlag", "true");

我也以同样的方式设置项目“ItemA”,“ItemB”和“ItemC”。在使用应用程序期间,每个键/值对都在不同的时间设置,因此没有定义它们的顺序。

我的问题是:

当我重新安装应用程序时,不首先删除现有副本,应用程序不再看到“MyFlag”,“I​​temB”或“ItemC” - 它 看到“ItemA”。使用window.localStorage.length返回1,它应该返回4.我已导出应用程序的数据文件,并使用SQLite Inspector(来自应用程序商店的应用程序)检查file__0.localstorage文件,并显示所有四个键/值对。 / p>

由于iOS 5.1+已将localstorage移动到Cache文件夹,我已按照here所述实现了file__0.localstorage文件的备份。基本上,它的作用是将localstorage db复制到app暂停和退出时的Documents文件夹,并在执行webViewDidStartLoad时复制回Cache文件夹。这部分工作正常,所以我不认为该程序导致了问题(在我添加该程序之前,应用程序中存在问题的症状)。

1 个答案:

答案 0 :(得分:1)

结果证明这是Cordova(Phonegap)错误报告here的结果。所以它是Apple将file__0.localstorage文件的位置移动到Cache目录的组合,以及Apple升级到应用程序的新版本并且几个.plist文件条目的应用程序的Bundle ID更改的组合没有更新以反映新的Bundle ID。

作为附件here发布的建议修补程序并不是完全可行的,因为包含的文件引用了引用JSONKit的CDVInvokedUrlCommand。因此,下载最新的CDVInvokedUrlCommand.h和CDVInvokedUrlCommand.m以及JSONKit.h和JSONKit.m(全部来自Cordova GitHub repo)也是必要的。 Phongap 1.4.1版本的建议修复程序的README.txt文件中的代码也包含错误。它说:

6)在您的应用程序的“AppDelegate.m”中,将“webViewDidStartLoad”函数替换为:

    - (void) webViewDidStartLoad:(UIWebView *)theWebView 
    {
        static CDVLocalStorage* localStorage = nil;
        if (localStorage == nil) {
            localStorage = [[CDVLocalStorage alloc] initWithWebView:theWebView];   
            [localStorage restore:nil withDict:nil];
        }

        return [ super webViewDidStartLoad:theWebView ];
    }

但它本应该说上面方法的主体添加到你已经拥有此签名的方法中 - 并且行[localStorage restore:nil withDict:nil];应该更改为[localStorage restore:nil];,因为前一个方法签名没有在任何地方都存在。

当然,还必须将适当的导入添加到AppDelegate.m。


对于能够这样做的人来说,升级到最新版本的Phonegap将是最简单的解决方案。但是,我们正在使用(相对突然)古老版本1.4.1和第三方插件,它与新版本的Phonegap不兼容 - 所以这个修复最适合我们。