我们都知道每个Andriod的应用程序都可以有自己的SQLite数据库,Andriod SDK当中也集成了SQLite开发所需要的包。开始学习的时候有些疑惑。SQLite是集成在Andriod系统当中,作为一种服务为每个应用提供存储功能呢?还是每个应用自己内部实现了一个SQLite数据呢?带着这个问题,我们先来看下Andriod架构图。
从架构图看,android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
而SQLite出现在了系统运行库层,按照文档的说法,SQLite 是一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
更多Andriod系统框架的知识,可以参考次博客:http://blog.chinaunix.net/uid-25838286-id-3011173.html
好!第一个为解决了。那我们怎么在程序当中使用SQLite呢?再来看下面这张图:
这是我自己画的,可能有些粗糙。SQLiteOpenHelper和SQLiteDatabase都是Andriod SDK自带的类。首先,我们需要定义一个类,来继承SQLiteOpenHelper,类名称可以自己定义,我这里用的是DBHelper。然后调用DBHelper的getWritableDatabase() 或者getReadableDatabase()方法来获取SQLiteDatabase的一个对象。
那问题又来了调用getWritableDatabase() 和getReadableDatabase()有啥不同呢?
getWritableDatabase取得的实例不是仅仅具有写的功能,而是同时具有读和写的功能同样的getReadableDatabase取得的实例也是具对数据库进行读和写的功能。
两者的区别在于
getWritableDatabase取得的实例是以读写的方式打开数据库,如果打开的数据库磁盘满了,此时只能读不能写,此时调用了getWritableDatabase的实例,那么将会发生错误(异常)
getReadableDatabase取得的实例是先调用getWritableDatabase以读写的方式打开数据库,如果数据库的磁盘满了,此时返回打开失败,继而用getReadableDatabase的实例以只读的方式去打开数据库。
好了,那我们再来说说OnCreat和OnUpgrade这两个方法的作用:
onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如果你愿意,设置为100也行),并且在onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。
具体可以参见这里:http://blog.youkuaiyun.com/jason0539/article/details/10248457
好吧!那么问题又来了既然onUpgrade是在版本更新的时候调用,那版本的更新,是在哪里设置的呢?
版本更新分为APP整体的版本更新和只针对数据库的版本更新。
只针对数据库的版本更新可以参见下文:
http://www.cnblogs.com/liqw/p/4264925.html
PS:关于SQLite语法等更详细的介绍,可以参见次博文:
http://blog.youkuaiyun.com/jason0539/article/details/10248457
最后提几句APP的版本版本更新
APP版本设置在Manifest.xml文件中
看到上边这个图,问题又来了。为什么版本号,要用两个值versionCode和versionName,他们的区别是什么?
答: