79

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

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

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

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

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

或者数据是否会更早地被销毁,例如: - 用户在浏览器中访问另一个站点 - 浏览器被手动关闭 - 浏览器进程被杀死或死亡 - 等等

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

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

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

4

8 回答 8

58

让我一步一步回答

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

数据保存在浏览器的“缓存”(不完全是缓存)中,因此如果您更改浏览器,或设置设置以删除或更改默认浏览器,数据就会消失。

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

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

或者数据是否会更早地被销毁,例如: - 用户在浏览器中访问另一个站点 - 浏览器被手动关闭 - 浏览器进程被杀死或死亡 - 等等

不,数据保持正常。:-)

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

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

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

于 2011-10-13T12:51:48.933 回答
40

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

Google Groups 讨论 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"];

以下代码允许您为本地存储设置另一个位置:

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];
} 
于 2012-03-22T10:18:09.337 回答
6

试试 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>);
于 2016-04-20T08:07:01.550 回答
4

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

用户可以转到设置并清除缓存和数据,在这种情况下它会去,或者如果说其中一个 clean-it 应用程序可以做到这一点。

即使在iOS上,它也是永久存储,但不知道应用程序更新场景。但是在旧版本(5.1)中它不是,并且在 6+ 中,他们使它可以通过由 cordova/phonegap 迅速启用的标志使其永久化。

于 2016-03-21T06:57:19.547 回答
4

现在可用的一个很好的解决方案是Cordova Native Storage Plugin

它通过在 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>);
于 2016-08-23T09:34:02.227 回答
1

我不能代表其他平台,但在我的 4.1 Android 设备上,我使用 localStorage 通过 jQuery Mobile 在本地存储一些数据,我发现 Android 每周左右都会在我不知情的情况下清除我的缓存。我将尝试 Web SQL,看看是否更好。

于 2012-12-13T04:49:08.943 回答
1

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

一些注意事项:

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

localStorage存储空间有限,通常为 5mb。

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

另一方面:

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

于 2017-05-27T12:23:40.733 回答
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
        });

});
于 2016-02-19T12:37:25.620 回答