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

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

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

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

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

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

或者数据会被更早的销毁,例如: – 用户在浏览器中访问另一个站点 – 浏览器被手工closures – 浏览器进程被终止或死亡 – 等等

或者localStorage和web SQL是您只在Android(Android)中进入“设置”>“应用程序”时才删除的存储types,并主动删除与该应用程序关联的用户数据?

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

在应用更新的情况下会发生什么? 本地和networking存储将被删除或将留下来?

让我一步一步回答

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

数据保存在浏览器的“caching”(不完全是caching)中,因此,如果更改浏览器或设置设置,以便删除或更改默认浏览器,则数据将会发送。

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

不,数据将保留在那里,不pipe多长时间不使用。 所以,即使你清除浏览器caching,它仍然会在那里。

或者数据会被更早的销毁,例如: – 用户在浏览器中访问另一个站点 – 浏览器被手工closures – 浏览器进程被终止或死亡 – 等等

不,数据保持不变。 🙂

或者localStorage和web SQL是您只在Android(Android)中进入“设置”>“应用程序”时才删除的存储types,并主动删除与该应用程序关联的用户数据?

是的,只有在您手动从应用程序中删除数据或卸载应用程序的情况下才会显示数据。 它将留在所有其他情况下。

编辑:在iOS的情况下,当设备中存储器短缺时,操作系统将删除本地存储器中的数据。

截至iOS 5.1 @ ghostCoder的答案不再有效。 苹果已决定将本地存储位置移动到可随时清空的caching文件夹中。 你可以在这里跟踪这个讨论:

Google Groups讨论本地存储

另外这个博客更详细地解释了这个问题:

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]; } 

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

它已经设置,放置并获得了实现android共享偏好和iOS NSUserDefaults这样的平台function的function,这使得数据存储安全性得到了允许。

 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>); 

现在可用的一个很好的解决scheme是Cordova本地存储插件 。

它允许一个简单而原生的持久性方法,通过在Android中本地实现SharedPreferences和iOS中的NSDefault来保存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>); 

Android上它是默认的永久存储。 即使用户更新您的应用程序,它保持不变。

用户可以去设置和清除caching和数据,在这种情况下,或者如果说一个干净的应用程序做它。

即使在iOS上,它也是永久存储,但不知道应用更新场景。 但是在较早的版本(5.1)中没有,并且在6+以上,他们通过一个可以通过cordova / phonegap启用的标志使它成为永久的。

我不能说其他平台,但在我的4.1 Android设备上,我使用localStorage在本地存储一些数据与jQuery Mobile,我发现Android将清除我的caching每周左右,不知道。 我打算给Web SQL一个试试看看是否更好。

我发现这个在线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 }); }); 

在性能,安全性和可靠性方面, AVOID使用本地存储并使用Cordova-sqlite-storage会更好。

一些说明:

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

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

随时可以通过操作系统(android,ios)擦除localStorage 。 如果您关心数据持久性,这真的很严重。

另一方面:

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