如何在 Android 应用的 web 视图中使用持久存储
Posted
技术标签:
【中文标题】如何在 Android 应用的 web 视图中使用持久存储【英文标题】:How to use persistent storage in webview of an Android app 【发布时间】:2019-08-22 02:21:47 【问题描述】:我通过cordova
开发了一个android 应用程序,它在webview 中运行。如何让应用程序在铬中使用persistent storage
?它只消耗temporary storage
。我需要使用persistent storage
的原因是我可以请求更多空间。如果我使用temporary storage
并且超出了最大限制,临时存储将删除数据库中的旧数据。
我在 chrome 控制台中运行下面的代码,它给了我we are using 0 of 0 bytes
,这意味着我可以使用的持久存储空间为 0。
navigator.webkitPersistentStorage.queryUsageAndQuota (
function(usedBytes, grantedBytes)
console.log('we are using ', usedBytes, ' of ', grantedBytes, 'bytes');
,
function(e) console.log('Error', e);
);
然后我运行下面的代码来请求更多的存储空间:
navigator.webkitPersistentStorage.requestQuota (
100 * 1024 * 1024, function(grantedBytes)
window.requestFileSystem(PERSISTENT, grantedBytes, (d) => console.log(d), e => console.error(e));
, function(e) console.log('Error', e);
);
之后什么都没有发生,我仍然可以使用 0 个存储空间。我想知道如何在 webview 中使用持久存储。我需要为此指定任何权限吗?
我的应用的权限是:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.INTERNET" />
我检查了另一个问题Android webview & localStorage,但它与我的完全不同。我要求为我的 webview 授予持久存储权限,但该问题没有解释如何使用persistent storage
,而是使用temporary storage
,这是 webview 中的默认存储。
我在 java 代码上设置了setDatabaseEnabled(true)
,但它没有使用persistent storage
。相反,它使用temporary storage
。
【问题讨论】:
Android webview & localStorage的可能重复 this one 似乎也相关。 @MartinZeitler 感谢您的 cmets。我已经检查了这两个其他问题,但没有一个在 webview 中使用persistent storage
。他们所做的只是使用temporary storage
。
你曾经解决过你的问题吗?
【参考方案1】:
setDatabaseEnabled() 似乎是唯一可用的方法:
设置是否启用数据库存储 API。默认值为
false
。
即使不能再更改数据库的位置;作为 setDataBasePath() 阅读:
此方法在 API 级别 19 中已弃用。
数据库路径由实现管理,调用此方法无效。
使用javascriptInterface
可能是持久化数据的一种解决方法;对于example。
相比之下,Cordova documentation 还列出了一些可能的选项。
【讨论】:
我在 java 代码上设置了setDatabaseEnabled(true)
,但它没有使用persistent storage
。相反,它使用temporary storage
。
@ZhaoYi 如果它不能直接与WebView
一起工作(Cordova 只是一个自定义版本),使用 SQLite 作为存储后端可能是最好的选择 - 这至少会持续到应用程序有已卸载...该数据库的默认位置是内部存储(无需请求运行时权限即可工作)。
我在本地存储上保存数据没有问题。问题是 webview 使用的存储是临时的,这意味着如果数据超出最大存储限制,它将删除数据。而且我不能要求更多的临时存储空间。我不介意使用 SQLite 或 IndexDB,只要它们可以使用持久存储。
@ZhaoYi 那些 SQLite 插件使用与大多数 Android 应用程序使用的几乎相同的存储设施,并且也适用于 ios 和 Windows ......仍然,一些 JS 代码需要迁移,但查询更快,并且数据库大小没有限制;除了光标窗口可能被限制为最多 2mb(至少在 Android 上这可能适用,不确定其他平台)。
限制大小不是由任何数据库决定的,比如 SQLite 或 IndexedDB。它受浏览器限制。在这里结帐:developer.chrome.com/apps/offline_storage以上是关于如何在 Android 应用的 web 视图中使用持久存储的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Ionic Android 中将 Javascript 注入 Web 视图?
Cookie 未保存在 Xamarin(Android)的 Web 视图中