如何在Android应用程序的WebView中使用持久存储

时间:2019-03-31 23:15:21

标签: android cordova webview

我通过cordova开发了一个Android应用程序,该应用程序在网络视图中运行。如何使应用程序在铬中使用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

1 个答案:

答案 0 :(得分:0)

setDatabaseEnabled()似乎仍然是唯一可用的方法:

  

设置是否启用数据库存储API。默认值为false

即使无法再更改数据库的位置;如 setDataBasePath()读为:

  

此方法已在API级别19中弃用。

     

数据库路径由实现管理,调用此方法将无效。

使用JavaScriptInterface可能是持久保存数据的一种变通方法。为example

相比之下,科尔多瓦documentation还列出了一些可能的选择。