手把手教你理解 Android SQLite数据库

       我们都知道每个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的实例以只读的方式去打开数据库。

具体可以参见这里:http://zhidao.baidu.com/link?url=ovpBNLjgACglCk44I38aOKvQNonCY02A4-IDy2Bs-0GNSC6r09qxMNOLK6bwwtciiybQGHMjFHv9QxyEqeTYmXCcUYS_wLnG2-ch3n5-KDG

好了,那我们再来说说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,他们的区别是什么?

答:

VersionCode -------  根据上面的描述,版本号(versioncode)是相对比较重要的一个属性。versionCode是一个Integer类型的值。所以大家在设置的时候,不要将versionCode设置的太大,最好不要超过Integer的取值范围(当然一般也是不会超过的),一般大家在发布自己的第一个应用到市场的时候,版本取值为1(versionCode=1),这也是目前典型和普遍的做法。
然后,每次发布更新版本时可以递增versionCode的值。上面描述版本控制重要性时也描述过,一个新版本的应用的versionCode不能小于之前旧版本的versionCode值,否则进行替换更新升级时会出错,系统提示无法安装。当然,这也不是强制的,只是正式发布应用时,建议必须考虑的问题。

VersionName ------ 这是一个值为String类型的属性,一般和VersionCode成对出现。VersionCode是方便程序开发者运行和维护Application而设置的一个有效的值。versionName是一个版本的描述,给用户看的,也是用户放在各个第3方平台上提供给使用者看的一个版本名,可以说是对VersionCode的解释和描述。一般格式可以为:1.1.2(major.minor.point)的形式。
关于数据具体如何实现的代码,上边链接上都有,可以参考,这里不再赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一步一台阶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值