您的位置:首页 > 移动开发 > Android开发

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

2015-01-31 17:44 423 查看
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)方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: