数据存储之三
sqlite嵌入式
数据库 1
文章分类:移动开发 前两篇日志我已经总结了本地数据存储的前两种:
文件和配置项。还剩下最后一种
数据库存储——
sqlite。 一、
sqlite简介 在Android平台上,集成了一个嵌入式关系型
数据库—
sqlite,
sqlite3
支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它
支持的类型虽然只有五种,但实际上
sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。
sqlite最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么。例如:可以在Integer字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段中保存除整数以外的数据时,将会产生
错误。另外,
sqlite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息。 二、
sqlite的CURD Android提供了一个名为
sqliteDatabase的类,该类封装了一些操作
数据库的API,使用该类可以完成对数据进行
添加(Create)、
查询(Retrieve)、更新(Update)和
删除(Delete)操作(这些操作简称为CRUD)。对
sqliteDatabase的学习,我们应该重点掌握exec
sql()和rawQuery()
方法。 exec
sql()
方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的
sql语句; rawQuery()
方法可以执行select语句。
sqliteDatabase还专门提供了对应于
添加、
删除、更新、
查询的操作
方法: insert()、delete()、update()和query() 。这些
方法实际上是给那些不太了解
sql语法的菜鸟使用的,对于熟悉
sql语法的程序员而言,直接使用exec
sql()和rawQuery()
方法执行
sql语句就能完成数据的
添加、
删除、更新、
查询操作。 三、
sqlite的事务管理 使用
sqliteDatabase的beginTransaction()
方法可以开启一个事务,程序执行到endTransaction()
方法时会检查事务的标志是否为成功,如果为成功则提交事务,否则回滚事务。当应用需要提交事务,必须在程序执行到endTransaction()
方法之前使用setTransactionSuccessful()
方法设置事务的标志为成功,如果不
调用setTransactionSuccessful()
方法,默认会回滚事务。 三、
sqlite创建、
更新数据表 如果应用使用到了
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(或其他数值),并且在onUpgrade()
方法里面实现表结构的更新。当软件的版本
升级次数比较多,这时在onUpgrade()
方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。 getWritableDatabase()和getReadableDatabase()
方法都可以
获取一个用于操作
数据库的
sqliteDatabase实例。但getWritableDatabase()
方法以读写方式打开
数据库,一旦
数据库的磁盘空间满了,
数据库就只能读而不能写,倘若使用的是getWritableDatabase()
方法就会出错。getReadableDatabase()
方法先以读写方式打开
数据库,如果
数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开
数据库。 四、
sqlite示例程序 我们编写一个对表(Contacts)进行的操作来演示
sqlite的应用。 1.创建Android工程 Project name: Android
sqlite BuildTarget:Android2.1 Application name:
sqlite嵌入式
数据库 Package name: com.changcheng.
sqlite Create Activity: Android
sqlite Min SDK Version:7 2. Contact实体 package com.changcheng.
sqlite.entity; public class Contact { private Integer _id; private String name; private String phone; public Contact() { super(); } public Contact(String name,String phone) { this.name = name; this.phone = phone; } public Integer get_id() { return _id; } public void set_id(Integer id) { _id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } @Override public String toString() { return "Contants [id=" + _id + ",name=" + name + ",phone=" + phone + "]"; } } 3.编写MyOpenHelper类 MyOpenHelper继承自
sqliteOpenHelper类。我们需要创建数据表,必须重写onCreate(更新时重写onUpgrade
方法)
方法,在这个
方法中创建数据表。 package com.changcheng.
sqlite; import android.content.Context; import android.database.
sqlite.
sqliteDatabase; import android.database.
sqlite.
sqliteOpenHelper; public class MyOpenHelper extends
sqliteOpenHelper { private static final String name = "contants"; //
数据库名称 private static final int version = 1; //
数据库版本 public MyOpenHelper(Context context) { /** * CursorFactory指定在执行
查询时获得一个游标实例的工厂类。 设置为null,则使用系统默认的工厂类。 */ super(context,name,null,version); } @Override public void onCreate(
sqliteDatabase db) { // 创建contacts表,
sql表达式时提供的字段类型和长度仅为提高
代码的可读性。 db.exec
sql("CREATE TABLE IF NOT EXISTS contacts(" + "_id integer primary key autoincrement," + "name varchar(20)," + "phone varchar(50))"); } @Override public void onUpgrade(
sqliteDatabase db,int newVersion) { // 仅演示用,所以先
删除表然后再创建。 db.exec
sql("DROP TABLE IF EXISTS contacts"); this.onCreate(db); } }
原文链接:https://www.f2er.com/sqlite/202761.html