Android和iOS上的本地存储有多长久?

时间:2011-10-13 07:36:37

标签: cordova local-storage web-sql

当我的应用程序在手机上本地存储数据时,该存储有多长久?我将详细说明具体情况:

我正在使用jQueryMobile和Phonegap构建应用程序。它本质上是一个浏览器应用程序,但使用Phonegap让我打包并在应用商店中出售,以及其他优势。

Phonegap提供两种存储方式,这两种方式都可以协调iOs,Android,Blackberry和其他一些操作系统的本机功能:localStorage(原始键值对)和Web SQL数据库。 localStorage和Web SQL都是属于浏览器的存储形式。话虽如此,我无法确定数据将保存多长时间,在什么情况下会被删除,在什么情况下可能无法使用等等。

例如,如果应用程序使用localStorage或Web SQL存储数据,并且用户在其Android上切换到其他标准浏览器,则应使用新浏览器打开应用程序,这是否意味着存储的数据不可用?

如果用户一年没有使用该应用程序(在我的情况下这是一个现实的,不一定是坏的情况),数据是否会像cookie一样过期,或者可能被推出浏览器的存储空间来自其他应用程序的大量数据?

或者甚至更早地销毁数据,例如: - 用户访问浏览器中的另一个站点 - 手动关闭浏览器 - 浏览器进程被终止或死亡 - 等等

或者localStorage和web SQL是您在(在Android中)转到设置>时仅删除的存储类型。应用并主动删除与应用相关联的用户数据?

感谢您的任何见解。在'WWW'上没有任何信息。

在应用更新的情况下会发生什么。本地和网络存储将被删除或保留吗?

8 个答案:

答案 0 :(得分:56)

让我一步一步回答

  

如果应用程序使用localStorage或Web SQL以及用户存储数据   切换到他们的Android上的不同标准浏览器,将   使用新浏览器打开应用程序,这意味着存储   数据不可用?

数据保存在浏览器的“缓存”(不完全是缓存)中,因此如果您更改浏览器或设置设置以便删除或更改默认浏览器,数据将会继续。 / p>

  

如果用户未使用该应用程序一年(在我的情况下是一个   现实的,不一定是坏的情况),数据会有   像cookie一样过期,或者可能被推出了浏览器   通过其他应用程序的大量数据存储?

不,数据将保留在那里,无论多长时间不使用。因此,即使您清除了浏览器缓存,它仍然会存在。

  

或者甚至更早地销毁数据,例如: - 用户   访问浏览器中的另一个站点 - 手动关闭浏览器 -   浏览器进程被终止或死亡 - 等等

不,数据保持不变。 : - )

  

或者localStorage和web SQL只是您的存储类型   删除(在Android中)您转到设置>应用并主动删除   与应用程序关联的用户数据?

是的,仅当您从应用程序中手动删除数据或卸载应用程序时,数据才会出现。它会留在所有其他情况下。

编辑: 对于iOS,当设备中存在内存不足时,操作系统将删除本地存储中的数据。

答案 1 :(得分:37)

从iOS 5.1 @ ghostCoder的回答不再有效。 Apple已决定将localstorage位置移动到缓存文件夹中,该文件夹可随时清空。您可以在此处跟踪此讨论:

Google Groups Discussion on Localstorage

此博客也更详细地解释了这个问题:

http://www.marco.org/2011/10/13/ios5-caches-cleaning

可以手动将本地存储位置指向安全的 Application_Home> / Documents 位置。要确定当前的本地存储位置,您可以使用以下内容:

NSString* localStorageSubdir = (IsAtLeastiOSVersion(@"5.1")) ? @"Caches" : @"WebKit/LocalStorage";
NSString* localStoragePath = [library stringByAppendingPathComponent:localStorageSubdir];
NSString* localStorageDb = [localStoragePath stringByAppendingPathComponent:@"file__0.localstorage"];

以下代码允许您为localstorage设置另一个位置:

NSString* bundleIdentifier = [[mainBundle infoDictionary] objectForKey:@"CFBundleIdentifier"];
NSString* libraryPreferences = @"Library/Preferences";
NSString* appPlistPath = [[bundlePath stringByAppendingPathComponent:libraryPreferences]    stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", bundleIdentifier]];

NSString *value;
NSString *key = @"WebKitLocalStorageDatabasePathPreferenceKey";
value = [appPlistDict objectForKey: key];
if (![value isEqual:ourLocalStoragePath]) {
    [appPlistDict setValue:yourPreferredLocalStoragePath forKey:key];
} 

答案 2 :(得分:5)

尝试使用NativeStorage插件。 https://www.npmjs.com/package/cordova-plugin-nativestorage

它设置,放置和获取实现平台功能的功能,如android共享首选项和iOS NSUserDefaults,使数据存储尽可能安全。

cordova plugin add cordova-plugin-nativestorage

NativeStorage.putObject("reference_to_value",<object>, <success-callback>, <error-callback>);

NativeStorage.getObject("reference_to_value",<success-callback>, <error-callback>);

答案 3 :(得分:3)

android 上,默认情况下它是永久存储。即使用户更新您的应用,它也会保持不变。

用户可以进行设置并清除缓存和数据,在这种情况下,或者如果说其中一个干净的应用程序执行此操作。

即使在 iOS 上,它也是永久存储,但不了解应用更新方案。但是在旧版本(5.1)中它没有,并且在6+中它们使得它可以通过一个由cordova / phonegap迅速启用的标志永久保留。

答案 4 :(得分:3)

现在可用的好解决方案是The Cordova Native Storage Plugin

它允许一种简单但原生的持久性方法,通过在iOS中安装Android和NSDefault中的SharedPreferences以保证可靠性,在iOS和Android中保存数据。

用法:

  

<强>安装:

cordova plugin add cordova-plugin-nativestorage
     

存储值

NativeStorage.setItem("reference_to_value",<value>,<success-callback>, <error-callback>);
     

检索值

NativeStorage.getItem("reference_to_value",<success-callback>, <error-callback>);

答案 5 :(得分:1)

我不能代替其他平台,但在我的4.1 Android设备上,我使用localStorage在本地存储jQuery Mobile的一些数据,而且我发现Android会在每周左右清除我的缓存知识。我将试一试Web SQL,看看它是否更好。

答案 6 :(得分:1)

使用本地存储避免在性能,安全性和可靠性方面会更好,而是使用Cordova-sqlite-storage

一些说明:

localStorage具有易于使用的优点,但它以同步方式工作。这意味着它可以锁定UI线程并导致性能降低。

localStorage的存储量有限,通常为5mb。

任何时候操作系统(android,ios)都可以清除

localStorage。如果你关心数据持久性,这真的很严重。

另一方面:

Cordova-sqlite-storage是异步的,它不会阻止UI线程,它会将您的数据保存在本机设备存储上,存储量不受限制,操作系统不会删除您的任何数据,除非您卸载应用程序。

答案 7 :(得分:0)

我在网上发现了ng-persist

  

将数据存储在移动设备上(使用cordova)即使存在,也会持续存在   用户重新安装应用程序

安装

bower install ng-persist ngstorage --save

$persist注入您的控制器

.controller('MyCtrl', function($persist) {

    $persist
        .set(namespace, key, val)
        .then(function () {
            // saved
        });

    // read
    $persist
        .get(namespace, key, fallback)
        .then(function (val) {
            // val is either the value, if exists, or the fallback
        });

    // delete
    $persist
        .remove(namespace, key)
        .then(function () {
            // removed
        });

});