Android数据处理之SQLite数据处理

背景概述


SQLite的特点

小型、单文件形式、B-Tree结构效率高、可嵌入、开源跨平台、关系型数据库、支持事务

 

 

实现方式介绍与对比


创建数据库的方式

  1. context.openOrCreateDatabase(name,mode,cursorFactory)
  2. 继承SQLiteOpenHelper并重写抽象方法

第一种方式打开或创建数据库,如果数据库存在,就打开,如果不存在,就先创建再打开。

但是其不具有扩展性,所以日常开发中并不建议这样使用,如果考虑到数据库的可操作性以及扩展性,建议实际项目中使用第二种方式。

 

操作数据库方式

  1. 执行原生SQL语句
  2. 使用SQLiteDatabase的相关API

 

 

常用可视化工具


  • 数据库文件导出工具
    • adb pull
    • Android Device Monitor(Tools ->Android)
  • 数据库文件查看工具
    • sqlite3
    • SQLite Professional
    • SQLPro

 

 

SQLiteDatabase类介绍


  • 提供访问SQLite数据库的方法
  • 提供增删改查、执行SQL命令的方法,以及执行数据库管理任务
  • 每个Application的数据库名必须唯一

 

 

SQLiteDatabase API概览


db.execSQL(sql)
db.insert(table,nullCol,contentValues)
db.delete(table,whereClause,whereArgs)
db.update(table,contentValues,whereClause,whereArgs)
db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy)

 

 

数据库的创建


  • SQLiteOpenHelper
    • SQLiteDatabase的帮助类,用于管理数据库的创建和更新
  • SQLiteOpenHelper常用方法
    • onCreate 创建方法
    • onOpen 打开方法
    • onUpgrade 升级方法
    • getReadableDatabase 获取SQLiteDatabase对象
    • getWritableDatabase 获取SQLiteDatabase对象
private static final String CREATE_COURSE="create table course ("+
			"id integer primary key autoincrement, "+
			"name text)";
private Context mContext;
@Override
public void onCreate(SQLiteDatabase db) {
	db.execSQL(CREATE_COURSE);
	Toast.makeText(mContext,"数据库创建成功", Toast.LENGTH_LONG).show();
}

当已经存在数据库时,再次获取SQLiteDatabase对象将不会再调用onCreate方法。

 

数据库的升级

private static final String CREATE_TEACHER="create table Teacher("
		+"id integer primary key autoincrement,"
		+"name text,"
		+"age integer,"
		+"desc text";
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	db.execSQL("drop table if exists Course");
	db.execSQL(CREATE_TEACHER);
}

如果传进来的newVersion版本号大于oldVersion,就会执行onUpgrade方法

 

 

数据增删改操作


通过execSQL()方法,传入SQL语句,即可执行增删改操作

增加数据

SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.execSQL("insert into course values (?,?)",new String[]{"2","张三"});

修改数据

SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.execSQL("update course set name=? where id=?",new String[]{"李四","2"});

删除数据

SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.execSQL("delete from course where id=?",new String[]{"2"});

 

除了上面的通过SQL语句的方式进行增删该,还可以通过SQLiteDatabase提供的API进行增删改

增加数据

增加数据,需要传入ContentValues,ContentValues即是键值对的集合,相当于HashMap

ContentValues values=new ContentValues();
values.put("id", "2");
values.put("name", "张三");
db.insert("course",null,values);

修改数据

ContentValues values=new ContentValues();
values.put("name", "李四");
db.update("course", values, "id=?", new String[]{"2"});

删除数据

db.delete("course", "id=?", new String[]{"1"});

 

 

数据查询操作


对于数据的查询,也是使用SQLiteDatabase对象,它有两个查询的方法

  • db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy),通过API来查询
  • db.rawQuery(sql,selectionArgs),通过原生的SQL语句进行查询

 

Cursor

上面方法的返回值是Cursor,游标接口,提供遍历查询结果的方法

 

Cursor常用方法

getCount()  //总记录条数
isFirst()  //是否为第一条记录
isLast()  //是否为最后一条记录
moveToFirst()  //移动到第一条记录
moveToLast()  //移动到最后一条记录
moveToNext()  //移动到下一条记录
moveToPrevious()  //移动到前一条记录
getInt(int columnIndex)  //获取指定列索引的int值
getString(int columnIndex)  //获取指定列索引的String值

 

使用SQL语句进行查询

Cursor cursor = db.rawQuery("select * from course", null);
if(cursor.moveToFirst()){
	do{
		String name= cursor.getString(cursor.getColumnIndex("name"));
	}while(cursor.moveToNext());
}
//释放游标
cursor.close();

 

通过API进行查询

Cursor cursor = db.query("course", null, null, null, null, null, null);

 

 

数据库事务操作


事务的概念

通常包含了对数据库读、写的一个序列的操作

 

ACID性质

原子性:所有操作要么全部执行,要么全不执行

一致性:满足完整性约束

隔离性:多个并发执行时,一个事务的执行不影响其他事务的执行

持久性:已被提交的事务对数据库的修改应该是永久保存在数据库中的

 

SQLite中实现事务

首先通过beginTransaction来开启事务,当操作都执行成功了,调用setTransactionSuccessful来标志这些操作都执行成功了,最后通过endTransaction来结束事务。

db.beginTransaction();
try {
	db.execSQL(sql1);
	db.execSQL(sql2);
	db.setTransactionSuccessful();
} catch (SQLException e) {
	e.printStackTrace();
}finally{
	db.endTransaction();
}

通过try...catch...finally...一旦没有执行setTransactionSuccessful()方法,直接endTransaction(),那么SQLite将会回滚到其之前的状态

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值