上次我向大家介绍了SQLite的基本信息和使用过程,相信朋友们对SQLite已经有所了解了,那今天呢,我就和大家分享一下在Android中如何使用SQLite。

现在的主流移动设备像Android、iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧。对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,我们可以轻松的完成对数据的存取。


一 、SQLiteOpenHelper

可以直接使用SQLiteDataBase直接去创建数据库,但是Android提供了一种更加安全优雅的方式去操作数据库,那就是SQLiteOpenHelper。SQLiteOpenHelper是用来管理数据库的一个工具类,可以用于管理数据库的创建和版本更新。

SQLiteOpenHelper是一个抽象类,所以要创建它的子类,重写它的方法来使用它创建和管理数据库。

子类继承SQLiteOpenHelper的方法,必须重写下面两个方法:

public abstract void onCreate(SQliteDatabase db);

public 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对象进行数据库操作。

举个简单的例子:

public class DBHelper extends SQLiteOpenHelper {        private static final String DATABASE_NAME = "test.db";      private static final int DATABASE_VERSION = 1;            public DBHelper(Context context) {          //CursorFactory设置为null,使用默认值          super(context, DATABASE_NAME, null, DATABASE_VERSION);      }        //数据库第一次被创建时onCreate会被调用      @Override      public void onCreate(SQLiteDatabase db) {          db.execSQL("CREATE TABLE IF NOT EXISTS person" +                  "(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER, info TEXT)");      }        //如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade      @Override      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {          db.execSQL("ALTER TABLE person ADD COLUMN other STRING");      }  }  


二 、SQLiteDatabase

SQLiteDatabase对象,代表的就是一个数据库(底层就是一个数据库文件)。我们可以调用SQLiteDatabase累的几个静态方法,来获得一个数据库对象。当然,更好的方法是上面介绍的,使用SQLiteOpenHelper的子类来获得一个SQLiteDatabase对象。


当然,不管以什么方式获得了SQLiteDatabase对象之后,我们就可以进行数据库的操作。大部分操作都类似于jdbc中的操作,很容易理解。

数据库的操作无非CURD,对于 增 删 改这三种情况,我们可以直接使用

public void execSQL (String sql)

public void execSQL (String sql, Object[] bindArgs)


这两种方法,直接执行标准的SQL语句,也可以用特定的方法来实现,不过对于熟悉SQL语言的人来说,还是使用前一种方法比较直接。


至于查询情况,就要复杂一点,我们也可以直接使用

public Cursor rawQuery(String sql,String[] selectionArgs)

方法,直接执行标准的SQL查询语句。当然,和增删改一样,也可以用特定的方法来实现。

不对用什么方法进行查询,都会将结果集作为一个Cursor游标对象返回。Cursor对象类是以jdbc中的ResultSet对象。

下面是Cursor对象的常用方法:

    //假设c是一个返回的Cursor对象    c.move(int offset); //以当前位置为参考,移动到指定行      c.moveToFirst();    //移动到第一行      c.moveToLast();     //移动到最后一行      c.moveToPosition(int position); //移动到指定行      c.moveToPrevious(); //移动到前一行      c.moveToNext();     //移动到下一行      c.isFirst();        //是否指向第一条      c.isLast();     //是否指向最后一条      c.isBeforeFirst();  //是否指向第一条之前      c.isAfterLast();    //是否指向最后一条之后      c.isNull(int columnIndex);  //指定列是否为空(列基数为0)      c.isClosed();       //游标是否已关闭      c.getCount();       //总数据项数      c.getPosition();    //返回当前游标所指向的行数      c.getColumnIndex(String columnName);//返回某列名对应的列索引值      c.getString(int columnIndex);   //返回当前行指定列的值  string类型   c.getInt(int columnIndex);   //返回当前行指定列的值  int类型    c.getFloat(int columnIndex);   //返回当前行指定列的值  float类型
关于更多的Cursor信息,可以参考官方文档中的说明。要想熟练的使用,还是得多多练习。



三、事务的概念

SQLite数据库也使用了事务的处理方法,SQLiteDatabase类也提供了事务处理的API。

使用beginTransaction()方法开启一个事务,然后执行数据库操作,然后调用setTransactionSuccessful()方法设置事务成功标志。使用endTransaction结束提交事务。

还可以使用inTransaction()方法判断是否处于一个事务中。

下面几个例子说明:

public void payment()  {     SQLiteDatabase db = dbOpenHelper.getWritableDatabase();     //开启事务     db.beginTransaction();     try     {     //执行数据库操作       db.execSQL("update person set amount=amount-10 where personid=?", new Object[]{1});         db.execSQL("update person set amount=amount+10 where personid=?", new Object[]{2});         //设置事务标志为成功,当结束事务时就会提交事务         db.setTransactionSuccessful();     }     catch(Exception e){       throw(e);   }   finally     {         //结束事务         db.endTransaction();     }  } 



最后:关于SQLiteDatabase的使用流程基本介绍完了,下面在介绍SQLite中数据库的操作和数据集返回如何处理。






更多相关文章

  1. Android(安卓)apk项目中添加ffmpeg编解码库
  2. Android之数据库Greedao的使用
  3. android APK应用层到kernel层功能接口调用实现总结
  4. android通过webview+jquery设计界面
  5. android LruCache源码解析
  6. Android(安卓)Activity之间跳转出现短暂黑屏的处理方法和intent.
  7. Android(安卓)调用系统相机,拍照,并上传图片所注意的一些问题
  8. Android(安卓)AsyncTask源码剖析
  9. Android(安卓)监听短信(同时监听广播和数据库)

随机推荐

  1. Android一次刷机
  2. ActionBar的使用——低版本兼容
  3. Android访问中央气象台的天气预报API得到
  4. Android(安卓)电话的反射调用机制实现静
  5. Android(安卓)应用软件开发(八)窗口布局
  6. 通过ijetty获取android设备的截图
  7. Does Android(安卓)Support Dual-Cores o
  8. Android(安卓)Service startForeground不
  9. android中dp和px的转换
  10. android camera(二):摄像头工作原理、s5PV