当我的应用程序在手机上本地存储数据时,该存储有多长久?我将详细说明具体情况:
我正在使用jQueryMobile和Phonegap构建应用程序。它本质上是一个浏览器应用程序,但使用Phonegap让我打包并在应用商店中出售,以及其他优势。
Phonegap提供两种存储方式,这两种方式都可以协调iOs,Android,Blackberry和其他一些操作系统的本机功能:localStorage(原始键值对)和Web SQL数据库。 localStorage和Web SQL都是属于浏览器的存储形式。话虽如此,我无法确定数据将保存多长时间,在什么情况下会被删除,在什么情况下可能无法使用等等。
例如,如果应用程序使用localStorage或Web SQL存储数据,并且用户在其Android上切换到其他标准浏览器,则应使用新浏览器打开应用程序,这是否意味着存储的数据不可用?
如果用户一年没有使用该应用程序(在我的情况下这是一个现实的,不一定是坏的情况),数据是否会像cookie一样过期,或者可能被推出浏览器的存储空间来自其他应用程序的大量数据?
或者甚至更早地销毁数据,例如: - 用户访问浏览器中的另一个站点 - 手动关闭浏览器 - 浏览器进程被终止或死亡 - 等等
或者localStorage和web SQL是您在(在Android中)转到设置>时仅删除的存储类型。应用并主动删除与应用相关联的用户数据?
感谢您的任何见解。在'WWW'上没有任何信息。
在应用更新的情况下会发生什么。本地和网络存储将被删除或保留吗?
答案 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。
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
});
});