上次我向大家介绍了SQLite的基本信息和使用过程,相信朋友们对SQLite已经有所了解了,那今天呢,我就和大家分享一下在Android中如何使用SQLite。
现在的主流移动设备像Android、iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧。对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,我们可以轻松的完成对数据的存取。
一 、SQLiteOpenHelper
可以直接使用SQLiteDataBase直接去创建数据库,但是Android提供了一种更加安全优雅的方式去操作数据库,那就是SQLiteOpenHelper。SQLiteOpenHelper是用来管理数据库的一个工具类,可以用于管理数据库的创建和版本更新。
SQLiteOpenHelper是一个抽象类,所以要创建它的子类,重写它的方法来使用它创建和管理数据库。
子类继承SQLiteOpenHelper的方法,必须重写下面两个方法:
1public abstract void onCreate(SQliteDatabase db);
2public abstract void onUpdate(SQLiteDatabase db,int oldVersion,int newVersion);
SQLiteOpenHelper会自动检测数据库文件是否存在。如果存在,会打开这个数据库,在这种情况下就不会调用onCreate()方法。如果数据库文件不存在,SQLiteOpenHelper首先会创建一个数据库文件,然后打开这个数据库,最后调用onCreate()方法。因此,onCreate()方法一般用来在新创建的数据库中建立表、视图等数据库组建。也就是说oncreate()方法在数据库文件第一次创建时调用。
先看看SQLiteOpenHelper类的构造方法再解释onUpdate()方法何时会被调用。
public SQLiteOpenHelper(Context context,String name,CursorFactory factory,int version);
其中name参数表示数据库文件名(不包括文件路径),SQLiteOpenHelper会根据这个文件名创建数据库文件。version表示数据库的版本号。如果当前传入的数据库版本号比上次创建或升级的版本号高,SQLiteOpenHelper就会调用onUpdate()方法。也就是说,当数据库第一次创建时会有一个初始的版本号。当需要对数据库中的表、视图等组建升级时可以增大版本号,再重新创建它们。现在总结一下oncreate()和onUpdate()调用过程。
1.如果数据库文件不存在,SQLiteOpenHelper在自动创建数据库后会调用oncreate()方法,在该方法中一般需要创建表、视图等组件。在创建前数据库一般是空的,因此不需要先删除数据库中相关的组件。
2.如果数据库文件存在,并且当前版本号高于上次创建或升级的版本号,SQLiteOpenHelper会调用onUpdate()方法,调用该方法后会更新数据库的版本号。在onupdate()方法中除了创建表、视图等组件外,还需要先删除这些相关的组件,因此,在调用onupdate()方法前,数据库是存在的,里面还原许多数据库组建。
综合上述两点,可以得出一个结论。如果数据库文件不存在,只有oncreate()被调用(该方法在创建数据库时被调用一次)。如果数据库文件存在,会调用onupdate()方法升级数据库,并更新版本号。
除了必须重写这两个方法外,还必须要一个构造方法:
SQLiteOpenHelper提供了两个构造方法:
1、public SQLiteOpenHelper(Context context,String name, SQLiteDatabase.CursorFactory factory, int version)
创建一个helper对象,用于管理数据库。
参数:
context : Context对象,用于去打开或创建一个数据库
name : 数据库名称
factory : 游标工厂,用于创建一个游标对象,如果使用null,则使用默认的游标
version : 数据库版本号,从1开始。如过版本号提升了,那么就去调用onUpgrade(SQLiteDatabase, int, int)方法。如过版本号降低了,那么就去调用onDowngrade(SQLiteDatabase, int, int)方法。
2、public SQLiteOpenHelper(Context context,String name, SQLiteDatabase.CursorFactory factory, int version,DatabaseErrorHandler errorHandler)
创建一个helper对象,用于管理数据库。
参数:
context : Context对象,用于去打开或创建一个数据库
name : 数据库名称
factory : 游标工厂,用于创建一个游标对象,如果使用null,则使用默认的游标
version : 数据库版本号,从1开始。如过版本号提升了,那么就去调用onUpgrade(SQLiteDatabase, int, int)方法。如过版本号降低了,那么就去调用onDowngrade(SQLiteDatabase, int, int)方法。
errorHandler :用于报告数据库
SQLiteOpenHelper类当然还有其他的方法,不过一般不需要我们去重写。
public synchronized void close() :关闭任何已经打开的数据库。
public String getDatabaseName() :返回打开的数据库的名称,就是构造器指定的那个数据库。
public synchronized SQLiteDatabase getReadableDatabase() :打开或者创建一个只读的数据库
public synchronized SQLiteDatabase getWriteableDatabase() :打开或者创建一个可读写的数据库
public void onDowngrade(SQLiteDadabase db,int oldVersion,int newVersion) :数据库版本号降低时调用
public void onOpen(SQLiteDatabase db) :数据库打开时调用
如何使用SQLiteOpenHelper的子类,去创建和管理数据库:
1、使用构造方法new一个helper对象
2、使用helper对象,调用getReadableDatabase()或getWriteableDatabase()方法返回一个SQLiteDatabase对象
3、使用SQLiteDatabase对象进行数据库操作。
举个简单的例子:
[html] view plaincopy
01public class DBHelper extends SQLiteOpenHelper {
02
03private static final String DATABASE_NAME = "test.db";
04private static final int DATABASE_VERSION = 1;
05
06public DBHelper(Context context) {
07//CursorFactory设置为null,使用默认值
08super(context, DATABASE_NAME, null, DATABASE_VERSION);
09}
10
11//数据库第一次被创建时onCreate会被调用
12@Override
13public void onCreate(SQLiteDatabase db) {
14db.execSQL("CREATE TABLE IF NOT EXISTS person" +
15"(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER, info TEXT)");
16}
17
18//如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade
19@Override
20public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
21db.execSQL("ALTER TABLE person ADD COLUMN other STRING");
22}
23}
二 、SQLiteDatabase
SQLiteDatabase对象,代表的就是一个数据库(底层就是一个数据库文件)。我们可以调用SQLiteDatabase累的几个静态方法,来获得一个数据库对象。当然,更好的方法是上面介绍的,使用SQLiteOpenHelper的子类来获得一个SQLiteDatabase对象。
当然,不管以什么方式获得了SQLiteDatabase对象之后,我们就可以进行数据库的操作。大部分操作都类似于jdbc中的操作,很容易理解。
数据库的操作无非CURD,对于 增 删 改这三种情况,我们可以直接使用
1public void execSQL (String sql)
2public void execSQL (String sql, Object[] bindArgs)
这两种方法,直接执行标准的SQL语句,也可以用特定的方法来实现,不过对于熟悉SQL语言的人来说,还是使用前一种方法比较直接。
至于查询情况,就要复杂一点,我们也可以直接使用
public Cursor rawQuery(String sql,String[] selectionArgs)
方法,直接执行标准的SQL查询语句。当然,和增删改一样,也可以用特定的方法来实现。
不对用什么方法进行查询,都会将结果集作为一个Cursor游标对象返回。Cursor对象类是以jdbc中的ResultSet对象。
下面是Cursor对象的常用方法:
[html] view plaincopy
01//假设c是一个返回的Cursor对象
02c.move(int offset); //以当前位置为参考,移动到指定行
03c.moveToFirst(); //移动到第一行
04c.moveToLast(); //移动到最后一行
05c.moveToPosition(int position); //移动到指定行
06c.moveToPrevious(); //移动到前一行
07c.moveToNext(); //移动到下一行
08c.isFirst(); //是否指向第一条
09c.isLast(); //是否指向最后一条
10c.isBeforeFirst(); //是否指向第一条之前
11c.isAfterLast(); //是否指向最后一条之后
12c.isNull(int columnIndex); //指定列是否为空(列基数为0)
13c.isClosed(); //游标是否已关闭
14c.getCount(); //总数据项数
15c.getPosition(); //返回当前游标所指向的行数
16c.getColumnIndex(String columnName);//返回某列名对应的列索引值
17c.getString(int columnIndex); //返回当前行指定列的值 string类型
18p; c.getInt(int columnIndex); //返回当前行指定列的值 int类型
19c.getFloat(int columnIndex); //返回当前行指定列的值 float类型
关于更多的Cursor信息,可以参考官方文档中的说明。要想熟练的使用,还是得多多练习。
三、事务的概念
SQLite数据库也使用了事务的处理方法,SQLiteDatabase类也提供了事务处理的API。
使用beginTransaction()方法开启一个事务,然后执行数据库操作,然后调用setTransactionSuccessful()方法设置事务成功标志。使用endTransaction结束提交事务。
还可以使用inTransaction()方法判断是否处于一个事务中。
下面几个例子说明:
[html] view plaincopy
01public void payment()
02{
03SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
04//开启事务
05db.beginTransaction();
06try
07{
08//执行数据库操作
09db.execSQL("update person set amount=amount-10 where personid=?", new Object[]{1});
10db.execSQL("update person set amount=amount+10 where personid=?", new Object[]{2});
11//设置事务标志为成功,当结束事务时就会提交事务
12db.setTransactionSuccessful();
13}
14catch(Exception e){
15throw(e);
16}
17finally
18{
19//结束事务
20db.endTransaction();
21}
22}
最后:关于SQLiteDatabase的使用流程基本介绍完了,下面在介绍SQLite中数据库的操作和数据集返回如何处理。
分享文章0