Android数据存储与IO之二 SQLite数据库

SQLite只是一个嵌入式的数据库引擎,专门适用于资源有限的设备商适量数据存储(SQLite数据库只是一个文件)
Android提供了SQLiteDatabase代表一个数据库,一旦应用程序获得了代表指定数据库的SQLiteDatabase对象,接下来就可通过SQLiteDatabase对象来管理、操作数据库了
有如下静态方法来打开一个文件对应的数据库
static SQLiteDatabase openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags)
打开path文件所代表的SQLite数据库
static SQLiteDatabase openOrCreateDatabase(File file, SQLiteDatabase.CursorFactory factory)
打开或创建file文件所代表的SQLite数据库
static SQLiteDatabase openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)

获取SQLiteDatabase对象之后,接下来就可以调用SQLiteDatabase的如下方法来操作数据库了
execSQL(String sql, Object[] bindArgs)
执行带占位的SQL语句
execSQL(String sql)

insert(String table,String nullColumnHack, ContentValues values)
向执行表中插入数据
update(String table, ContentValues values, String whereClause, String[] whereArgs)
更新指定表中特定数据
delete(String table, String whereClause, String[] whereArgs)
删除指定表中特定数据
Cursor query(String table, String[] columns, String whereClause, String[] whereArgs, String groupBy,String having, String orderBy)

Cursor query(String table, String[] columns, String whereClause, String[] whereArgs, String groupBy,String having, String orderBy, String limit)
limit控制最多查询几条记录(用于控制分页的参数)
Cursor query(boolean distinct, String table, String[] columns, String whereClause, String[] whereArgs, String groupBy, String having, String orderBy, String limit)
第一个参数控制是否去除重复值
rawQuery(String sql, String[] selectionArgs)
执行带占位符的SQL查询
beginTransaction()
开始事务
endTransaction()
结束事务
Android考虑到部分开发者对SQL语法不熟悉,所以提供了上述方法
上述查询方法都是返回一个Cursor,Cursor同样提供如下方法来移动查询结果的记录指针
move(int offset)
将记录指针向上或向下移动指定行数(负则为上)
boolean moveToFirst()

boolean moveToLast()

boolean moveToNext()

boolean moveToPosition(int position)

boolean moveToPrevious()
将记录指针移动到上一行
一旦记录指针移动到指定行之后,接下来就可以调用Cursor的getXxx()方法获取该行的指定列数据


创建数据库和表
SQLiteDatabase.openOrCreateDatabase(“/mnt/db/temp.db3”,null);
上面代码中没有指定SQLiteDatabase.CursorFactory参数,该参数是一个用于返回Cursor的工厂,若指定为null,则意味着使用默认工厂
sql = “create table user_if(user_id integer primary key ,”
          +” user_name varchar(255),"
          +” user_pass varchar(255))"
db.execSQL(sql);
上面的代码即可在数据库中创建一个数据表
如果需要执行查询语句,则可调用SQLiteDatabase的rawQuery(String sql,String[] selectionArgs)方法,例如
db.execSQL(“insert into news_if values(null,? , ?)" ,new String[]{title, content});


sqlite3工具
一个简单的SQLite数据库管理工具,sqlite3中常用命令:
  • .databases
  • .tables
  • .help
SQLite内部只支持NULL、INTEGER、REAL、TEXT和BLOB这5种类型,但实际上SQLite亦可接受varchar(n)、char(n)、decimal(p,s)等数据类型,只不过SQLite会在运算或保存时将它们转化为上面5种类型。
另外,SQLite还允许把各种类型的数据保存到任何类型字段中,开发者可以不用关心声明该字段所使用的数据类型;但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数,当向这种字段保存除整数以外的其他类型数据时,会出错
create table my_test
{
     _id integer primary key auto increment,
     name,
     pass,
     gender
}


使用特定方法操作SQLite数据库
SQLiteDatabase提供了insert、update、delete、query来操作数据库
SQL语法可以说是基本功中的基本功


事务
SQLiteDatabase中包含如下两个方法来控制事务
beginTransaction()
endTransaction()
当程序执行endTransaction()方法时会结束事务——那到底是提交事务呢,还是回滚事务呢?这取决于SQLiteDatabase是否调用了setTransactionSuccessful()方法来设置事务标志,如果设置了则提交事务,否则回滚事务
另外,SQLiteDatabase还提供了如下方法来判断当前上下文是否处于事务环境中
inTransaction()
//示例代码
db.beginTransaction();
try
{
     ...
     db.setTransactionSuccessful();
}
finally
{
     db.endTransaction();
}

SQLiteOpenHelper 类
实际项目中很少使用SQLiteDatabase的方法来打开数据库,通常都会继承SQLiteOpenHelper开发子类,并通过该子类的getReadableDatabase()、getWritableDatabase()方法打开数据库
一般用法是创建SQLiteOpenHelper子类,并扩展它的onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法
SQLiteOpenHelper包含如下常用方法:
synchronized SQLiteDatabase getReadableDatabase()
以读写方式打开
synchronized SQLiteDatabase getWriteableDatabase()
以写的方式打开
abstract void onCreate(SQLiteDatabase db)
当第一次创建数据库时回调
abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
当数据库版本更新时回调
synchronized void close()
关闭所有打开的SQLIteDatabase
重写onCreate(),可以生成数据库表结构及添加一些应用使用到的初始化数据
只要某次创建SQLiteOpenHelper时指定的数据库版本号高于之前指定的版本号,系统就会自动触发onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值