天天看點

Android Webview HTML5 Application cacheandroid 2.3 sqlite WAL 機制 詢問

經過幾天的探索和反複的嘗試,終于有了一點點進展了。

http://johncookie.iteye.com/blog/1182459

http://developer.android.com/reference/android/webkit/WebSettings.html#setAppCachePath(java.lang.String)

這2篇裡說的細節幫我解決了一個大問題。

http://www.2cto.com/kf/201302/188431.html

http://blog.csdn.net/moubenmao/article/details/9076917

這篇寫的特别好,很多細節的點。

https://code.google.com/p/android/issues/detail?id=24180

github上一篇,可以作為參考的:

https://gist.github.com/jaydeepw/3594828

下面的都是我一點點看過的,也很用的。

http://stackoverflow.com/search?q=android+webview+html5+cache

http://stackoverflow.com/questions/8911666/storing-a-webview-for-offline-browsing-android/8911966#8911966

http://stackoverflow.com/questions/14348118/how-to-check-for-availability-before-automatic-refresh/14348234#14348234

http://stackoverflow.com/questions/12510038/android-webview-application-clears-html5-cached-data-on-force-close-reboot

http://hulucat.com/tech/html5-webview%E7%9A%84%E6%9C%AC%E5%9C%B0%E5%AD%98%E5%82%A8%E4%BC%98%E5%8C%96/

http://www.eoeandroid.com/thread-239818-1-1.html

http://www.w3school.com.cn/html5/html_5_app_cache.asp

http://www.cnblogs.com/nuliniaoboke/archive/2012/12/03/2799772.html

http://www.jiangkunlun.com/tag/html5/

http://www.cnblogs.com/andriod-html5/archive/2012/06/06/2537850.html

http://stackoverflow.com/questions/14908533/android-webview-not-loading-second-page-from-cache?rq=1

http://www.html5rocks.com/en/tutorials/appcache/beginner/

http://blog.sethladd.com/2010/10/proposal-to-enhance-html5-app-cache.html

http://stackoverflow.com/questions/1998400/data-directory-have-no-read-write-permission-in-android

http://www.fengfly.com/plus/view-211735-1.html

http://blog.csdn.net/changemyself/article/details/8838499

補充一下:

1.使用localStorage一定要設定下面兩個屬性,我開始就設定了第一行,但是當我殺死應用程序後,在進入,保留的localStorage的内容就沒有了。

 mWebview.getSettings().setDomStorageEnabled(true);

String dir = mWebview.getContext().getDir("database", Context.MODE_PRIVATE)

                .getPath();

mWebview.getSettings().setDatabasePath(dir);

如果需要存儲一些簡單的用key/value對即可解決的資料,DOM Storage是非常完美的方案。根據作用範圍的不同,有Session Storage和Local Storage兩種,分别用于會話級别的存儲(頁面關閉即消失)和本地化存儲(除非主動删除,否則資料永遠不會過期)。

在Android中可以手動開啟DOM Storage(setDomStorageEnabled),設定存儲路徑(setDatabasePath)

Android中Webkit會為DOM Storage産生兩個檔案(my_path/localstorage/http_h5.m.taobao.com_0.localstorage和my_path/localstorage/Databases.db)。

另外,在Android中清除緩存時,如果需要清除Local Storage的話,僅僅删除Local Storage的本地存儲檔案是不夠的,記憶體裡面有緩存資料。如果再次進入頁面,Local Storage中的緩存資料同樣存在。需要殺死程式運作的目前程序再重新啟動才可以。

2.AppCache使我們能夠有選擇的緩沖web浏覽器中所有的東西,從頁面、圖檔到腳本、css等等。尤其在涉及到應用于網站的多個頁面上的CSS和JavaScript檔案的時候非常有用。其大小目前通常是5M。(大小這個,經過我的實際測試,設定1G都沒有問題,并且對于資源來說,我用20M的圖檔資源都可以緩存下來,是以大小應該不用擔心,不要放過大的檔案,比如單個檔案好幾百M的就行)

在Android上需要手動開啟(setAppCacheEnabled),并設定路徑(setAppCachePath)和容量(setAppCacheMaxSize)

Android中Webkit使用一個db檔案來儲存AppCache資料(my_path/ApplicationCache.db)

因為appCache的緩存路徑是可以設定的,是以,我們可以放到SD卡的一個路徑上,防止使用者清除緩存後,把緩存資料删掉。那麼第一次無網絡情況下,進入應用怎麼辦呢?我現在使用的一個辦法就是先在有網絡的情況下,使用一次,會緩存所有檔案到一個ApplicationCache.db這個檔案中,然後把這個db檔案放到我們自己設定的路徑下,并設定appCache的緩存路徑為這個,這樣,在使用者第一次無網絡使用的時候就可以看到有資料了。不過有個問題就是,一般的應用是無法内置這個初始資料的,除非大的應用和廠商有合作關系的,但是這太少了。

3.appCache緩存的時候,如果檔案有更新,就傳回200,如果某個檔案沒有更改,就傳回304,表示沒有更新,這樣可以節省流量,對304的了解需要仔細思考:http://www.cnblogs.com/elaborateday/archive/2011/04/06/2007019.html

-------------------------------------------------------------------------------------------------------------------

今天測試的時候發現一個大問題,之前測試的時候,緩存檔案隻會生成一個Application.db檔案,但是用有的手機測試會生成3個檔案:Application.db, Application.db-shm, Application.db-wal。我嘗試過删除後面2個檔案都沒有什麼影響,但是不知道這2個檔案是幹什麼的。

http://blog.csdn.net/zhjp4295216/article/details/7729429

http://www.cnblogs.com/mengshu-lbq/archive/2011/12/10/2283146.html

http://www.gsdtarena.com/a/Androidjc/285.html

準确的說應該是android2.3的就多了這兩個檔案了,可以直接删除,不影響的,這兩個檔案具體是幹什麼的,還沒有弄明白,在sqlite的官網上找到答案了,位址 http://www.sqlite.org/fileformat2.html  

我通過adb進入手機app的db存儲目錄,目錄下除了有xx.db檔案外,還存在xx.db-wal和xx.db-shm檔案(模拟器中沒有)。

以settings為例:

/data/data/com.android.providers.settings/databases 目錄下有 settings.db、settings.db-shm、settings.db-wal 三個檔案。

本人對資料庫不了解,請高手下面疑惑:

1. xx.db-wal和xx.db-shm什麼情況下會産生?

2. xx.db-wal和xx.db-shm的作用是什麼?

android 2.3 sqlite WAL 機制 詢問

我現在需要在2.3的downloadprovider程序裡去打開browser的webview.db 這個資料庫,這個資料庫我已經在建立的時候 給他設定了一個 world_readable的權限,但是在Downloadprovider程序裡 區打開的時候 始終打不開,爆出的錯是sqlite3_exec to set WAL journal_mode = WAL failed

這個可以在 /frameworks/base/core/jni/android_database_SQLiteDatabase.cpp  中找到

.我嘗試過用 同樣的方法載browser程序裡打開是很友善的.

現在還是打不開,不知道哪位大俠是否有知道這個WAL 機制的,我也嘗試看過WAL 的機制 一知半解,希望有人能指點一下 不勝感激.

使用WLA,必須要以讀寫的模式打開資料庫檔案。不然是無法使用WAL的。因為在WAL模式設定之前,會對資料庫檔案屬性進行判斷,隻有是讀寫的情況下,才能設定。

===========================================================================================

         android sqlite db-journal檔案産生原因及說明

分類: android 2012-08-06 11:18 2778人閱讀 評論(1) 收藏 舉報 sqlite android 資料庫 磁盤 google 文檔

今天在android中将sqlite的資料庫檔案生成在SD卡上的過程中,發現生成的.db檔案的旁邊

生成了一個大小為0的與資料庫檔案同名的.db-journal檔案,不明白此檔案的用途,于是

google了sqlite的官方文檔,發現該檔案的用途如下:

該檔案是sqlite的一個臨時的日志檔案,主要用于sqlite事務復原機制,在事務開始時産生,

在事務結束時删除;當程式發生崩潰或者系統斷電時該檔案将留在磁盤上,以便下次程式運作

時進行事務復原。

但是我建立資料庫時将事務結束了,同時程式也沒有崩潰,為什麼還是會在磁盤上産生

.db-journal檔案呢?

深入研究,發現這是sqlite生成日志檔案的不同模式造成的,在android采用的這種模式下,

.db-journal檔案是永久的留在磁盤上不會被自動清除的,如果沒有發生事務復原那麼.db-journal

檔案的大小為0,這樣就避免了每次生成和删除.db-journal檔案的開銷。

到此,所有的疑惑解開了。

繼續閱讀