一、使用嵌入式关系型sqlite数据库存储数据
在android平台上,集成了一个嵌入式关系型数据库——sqlite,sqlite3支持null、integer、real(浮点数字)、 text(字符串文本)和blob(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、 char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 sqlite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。 但有一种情况例外:定义为integer primary key的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。 另外,在编写create table 语句时,你可以省略跟在字段名称后面的数据类型信息,如下面语句你可以省略name字段的类型信息:
create table person (personid integer primary key autoincrement, name varchar(20))
sqlite可以解析大部分标准sql语句,如:
我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了sqlite数据库,我们必须在用户初次使用软件时创建出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工方式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在android系统,为我们提供了一个名为sqliteopenhelper的抽象类,必须继承它才能使用,它是通过对数据库版本进行管理来实现前面提出的需求。
为了实现对数据库版本进行管理,sqliteopenhelper类提供了两个重要的方法,分别是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()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。
getwritabledatabase()和 getreadabledatabase()方法都可以获取一个用于操作数据库的sqlitedatabase实例。但 getwritabledatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getwritabledatabase()打开数据库就会出错。getreadabledatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
注意:getwritabledatabase(),getreadabledatabase的区别是当数据库写满时,调用前者会报错,调用后者不会,所以如果不是更新数据库的话,最好调用后者来获得数据库连接。
代码:
@override
public void oncreate(sqlitedatabase db) {
db.execsql("create table if not exists person (
personid integer primary key autoincrement, name varchar(20), age integer)");
}
@override
public void onupgrade(sqlitedatabase db, int oldversion, int newversion) {
db.execsql(" alter table person add phone varchar(12) null "); //往表中增加一列
// drop table if exists person 删除表
}
}
三、使用sqlitedatabase操作sqlite数据库
android提供了一个名为sqlitedatabase的类,该类封装了一些操作数据库的api,使用该类可以完成对数据进行添加(create)、查询(retrieve)、更新(update)和删除(delete)操作(这些操作简称为crud)。对sqlitedatabase的学习,我们应该重点掌握execsql()和rawquery()方法。execsql()方法可以执行insert、delete、update和create table之类有更改行为的sql语句; rawquery()方法用于执行select语句。
execsql()方法的使用例子:
sqlitedatabase的rawquery()用于执行select语句,使用例子如下:
除了前面给大家介绍的execsql()和rawquery()方法, sqlitedatabase还专门提供了对应于添加、删除、更新、查询的操作方法: insert()、delete()、update()和query() 。这些方法实际上是给那些不太了解sql语法的菜鸟使用的,对于熟悉sql语法的程序员而言,直接使用execsql()和rawquery()方法执行sql语句就能完成数据的添加、删除、更新、查询操作。
insert()方法用于添加数据,各个字段的数据使用contentvalues进行存放。contentvalues类似于map,相对于map,它提供了存取数据对应的put(string key, xxx value)和getasxxx(string key)方法,key为字段名称,value为字段值,xxx指的是各种常用的数据类型,如:string、integer等。
delete()方法的使用:
query()方法实际上是把select语句拆分成了若干个组成部分,然后作为方法的输入参数:
四、使用sqliteopenhelper获取用于操作数据库的sqlitedatabase实例
public class databasehelper extends sqliteopenhelper {
private static final string name = "ljqdb"; //数据库名称
private static final int version = 1; //数据库版本
......略
}
public class helloactivity extends activity {
@override public void oncreate(bundle savedinstancestate) {
......
button button =(button) this.findviewbyid(r.id.button);
button.setonclicklistener(new view.onclicklistener(){
public void onclick(view v) {
databasehelper databasehelper = new databasehelper(helloactivity.this);
sqlitedatabase db = databasehelper.getwritabledatabase();
db.execsql("insert into person(name, age) values(?,?)", new object[]{"林计钦", 4});
db.close();
}});
}
}
第一次调用getwritabledatabase()或getreadabledatabase()方法后,sqliteopenhelper会缓存当前的sqlitedatabase实例,sqlitedatabase实例正常情况下会维持数据库的打开状态,所以在你不再需要sqlitedatabase实例时,请及时调用close()方法释放资源。一旦sqlitedatabase实例被缓存,多次调用getwritabledatabase()或getreadabledatabase()方法得到的都是同一实例。
五、使用事务操作sqlite数据库
使用sqlitedatabase的begintransaction()方法可以开启一个事务,程序执行到endtransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endtransaction()之前调用了settransactionsuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用settransactionsuccessful() 方法则回滚事务。
使用例子如下:
如对本文有疑问, 点击进行留言回复!!
LongClick原理、上下文菜单原理、EditText长按弹窗原理、WebView长按弹窗自定义、修复WebView全选重复bug ———————————————— 版权声明:本文为CSDN博主「
JobScheduler 实现 特定时间,特定条件(系统空闲,电池电量,磁盘空间 ……)下执行任务
温习Android基础知识——《第一行代码(第三版)》读书笔记 Chapter 10 Service
网友评论