SQLiteOpenHelper 的使用

A helper class to manage database creation and version management.

You create a subclass implementing onCreate(SQLiteDatabase)onUpgrade(SQLiteDatabase, int, int) and optionallyonOpen(SQLiteDatabase), and this class takes care of opening the database if it exists, creating it if it does not, and upgrading it as necessary. Transactions are used to make sure the database is always in a sensible state.

This class makes it easy for ContentProvider implementations to defer opening and upgrading the database until first use, to avoid blocking application startup with long-running database upgrades.

基本介绍照搬google官方的,没有它更精准的介绍了。总的来说要注意两个方法,onCreate(SQLiteDatabase) and onUpgrade(SQLiteDatabase).

 onCreate(SQLiteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行。 

onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):当打开数据库时传入的版本号与当前的版本号不同时会调用该方法,用于更新数据库。特别是当你的openHelper有改动时,别忘了把version调上去,要不你老版本的用户就悲剧了。

这是我项目里的一个openHelper:

public class DaoMaster extends SQLiteOpenHelper {

    public static final int SCHEMA_VERSION = 2;
    public static final  String DB_NAME = "wawa.db";

    private static DaoMaster instance=null;

    private DaoMaster(Context context) {
        super(context, DB_NAME, null, SCHEMA_VERSION);
    }

    public synchronized static DaoMaster getInstance(Context context) {
        if(instance == null) {
            instance = new DaoMaster(context);
        }
        return instance;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        createAllTables(db);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        dropAllTables(db);
        onCreate(db);
    }

    public static void createAllTables(SQLiteDatabase db) {
        UserDao.createTable(db);
        ProfileDao.createTable(db);
        SubscribeDao.createTable(db);
    }

    public static void dropAllTables(SQLiteDatabase db) {
        UserDao.dropTable(db);
        ProfileDao.dropTable(db);
        SubscribeDao.dropTable(db);
    }
}

使用SQLiteDatabase操作SQLite数据库:

Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。对SQLiteDatabase的学习,我们应该重点掌握execSQL()和rawQuery()方法。execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句; rawQuery()方法用于执行select语句。
execSQL()方法的使用例子:

SQLiteDatabase sq=DaoMaster.getInstance().getWritableDatabase();

db.execSQL("insert into person(name, age) values('你大爷', 23)");
db.
close();

有些时候用户往往还会输入像“ & ”这些特殊SQL符号,为保证组拼好的SQL语句语法正确,必须对SQL语句中的这些特殊SQL符号都进行转义,显然,对每条SQL语句都做这样的处理工作是比较烦琐的。 SQLiteDatabase类提供了一个重载后的execSQL(String sql, Object[] bindArgs)方法,使用这个方法可以解决前面提到的问题,因为这个方法支持使用占位符参数(?)。使用例子如下:

  
  
SQLiteDatabase db = ....; db.execSQL(" insert into person(name, age) values (?,?)", new Object [] {"xxxx", 4 }); db. close ();

execSQL(String sql, Object[] bindArgs)方法的第一个参数为SQL语句,第二个参数为SQL语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应。

SQLiteDatabase的rawQuery()用于执行select语句,使用例子如下:

复制代码
  
  
SQLiteDatabase db = ....; Cursor cursor = db.rawQuery(" select * from person", null ); while ( cursor .moveToNext()) { int personid = cursor .getInt( 0 ); // 获取第一列的值,第一列的索引从0开始 String name = cursor .getString( 1 ); // 获取第二列的值 int age = cursor .getInt( 2 ); // 获取第三列的值 } cursor . close (); db. close ();
复制代码

rawQuery()方法的第一个参数为select语句;第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null。带占位符参数的select语句使用例子如下:

  
  
Cursor cursor = db.rawQuery(" select * from person where name like ? and age = ?", new String [] {" % 林计钦 % ", " 4 "});


Cursor是结果集游标,用于对结果集进行随机访问,如果大家熟悉jdbc, 其实Cursor与JDBC中的ResultSet作用很相似。使用moveToNext()方法可以将游标从当前行移动到下一行,如果已经移过了结果集的最后一行,返回结果为false,否则为true。另外Cursor 还有常用的moveToPrevious()方法(用于将游标从当前行移动到上一行,如果已经移过了结果集的第一行,返回值为false,否则为true )、moveToFirst()方法(用于将游标移动到结果集的第一行,如果结果集为空,返回值为false,否则为true )和moveToLast()方法(用于将游标移动到结果集的最后一行,如果结果集为空,返回值为false,否则为true ) 。

除了前面给大家介绍的execSQL()和rawQuery()方法, SQLiteDatabase还专门提供了对应于添加、删除、更新、查询的操作方法: insert()、delete()、update()和query() 。

inset():

SQLiteDatabase db = databaseHelper.getWritableDatabase();
ContentValues
values = new ContentValues();
values.put("name", "哇哇哇");
values.put("age", 23);
long rowid = db.insert(“person”, null, values);//返回新添记录的行号,与主键id无关

delete():

  
  
SQLiteDatabase db = databaseHelper.getWritableDatabase(); db.delete( " person " , " personid<? " , new String[]{ " 2 " }); db.close();

上面代码用于从person表中删除personid小于2的记录。

update():

  
  
SQLiteDatabase db = databaseHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(“name”, “wawawa”); // key为字段名,value为值 db.update( " person " , values, " personid=? " , new String[]{ " 1 " }); db.close();

上面代码用于把person表中personid等于1的记录的name字段的值改为“wawawa”。

query()稍微复杂些:

  
  
SQLiteDatabase db = databaseHelper.getWritableDatabase(); Cursor cursor = db.query("person", new String [] {"personid,name,age"}, "name like ?", new String [] {" % ljq % "}, null , null , "personid desc ", " 1 , 2 "); while ( cursor .moveToNext()) { int personid = cursor .getInt( 0 ); // 获取第一列的值,第一列的索引从0开始 String name = cursor .getString( 1 ); // 获取第二列的值 int age = cursor .getInt( 2 ); // 获取第三列的值 } cursor . close (); db. close ();
复制代码

上面代码用于从person表中查找name字段含有“传智”的记录,匹配的记录按personid降序排序,对排序后的结果略过第一条记录,只获取2条记录。
query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)方法各参数的含义:
table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。
columns:要查询出来的列名。相当于select语句select关键字后面的部分。
selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”
selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。
groupBy:相当于select语句group by关键字后面的部分
having:相当于select语句having关键字后面的部分
orderBy:相当于select语句order by关键字后面的部分,如:personid desc, age asc;
limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。

使用事务操作SQLite数据库

使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。每个对数据库的操作都放在一组事务中避免开启关闭数据库太频繁到这数据库locked!!!

使用例子如下:

public static void insert(Context context, ContentValues contentValues) {
    SQLiteDatabase db = DaoMaster.getInstance(context).getWritableDatabase();
    db.beginTransaction();
    try {
        db.insert(TABLE_NAME, null, contentValues);
        db.setTransactionSuccessful();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        db.endTransaction();
        db.close();
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值