android mysql sqlite_android SQLite数据库在Android中的API

上次我向大家介绍了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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值