天天看点

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文件的开销。

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

继续阅读