一. 前言

1. 什么是SQlite?

SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎,它是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且由于其占用资源低(占用内存只需几百K)、处理速度快等特点,非常受欢迎。

2. SQlite的优点

  • 轻量级
  • 独立
  • 隔离
  • 跨平台
  • 多语言接口
  • 安全性

3. 注意

IO操作,建议放在线程操作,因为可能卡死。

4. 创建数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class DatabaseHelper extends SQLiteOpenHelper {
//数据库名称
public static final String DATABASE_NAME = "user.db";
//数据库版本
public static final int DATABASE_VERSION = 1;
public static final String TABLE_NAME = "user";
public static final String COLUMN_NAME = "username";
public static final String COLUMN_PASSWORD = "password";

/**
* 构造方法
* @param context
*/
public DatabaseHelper(Context context) {

super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

/**
* 创建数据库
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
//执行创建语句
db.execSQL("create table " + TABLE_NAME + "(" + COLUMN_NAME + " varchar(20) not null, " + COLUMN_PASSWORD + " varchar(20) not null);");
}

/**
* 更新数据库
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//数据库更新操作 oldVersion > newVersion 的时候会调用这个方法
}
}
1
2
3
//Activity的onCreate方法中添加以下代码,数据库文件就会被创建成功
DatabaseHelper databaseHelper = new DatabaseHelper(this);
SQLiteDatabase database = databaseHelper.getWritableDatabase();

5. 查看数据库

借助第三方库:Android-Debug-Database-Github地址

使用参考文章:调试手机中数据库的福音:Android-Debug-Database

数据库创建后的效果图:

二. 对数据库进行增删改查

源码下载:SQLite

1. 增-插入记录

① 方法

1
2
3
4
5
6
7
/**
* @param table 插入的表
* @param nullColumnHack 给null即可
* @param values 插入的值
* @return 插入成功:返回插入的id,插入失败:返回-1
*/
public long insert(String table, String nullColumnHack, ContentValues values)

② 例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 插入记录
* @param database
*/
public void insert(SQLiteDatabase database) {
//ContentValues
ContentValues contentValues = new ContentValues();
contentValues.put(DatabaseHelper.COLUMN_NAME,"许小石");
contentValues.put(DatabaseHelper.COLUMN_PASSWORD,"123456");

//插入成功:返回插入的id
//插入失败:返回-1
long insert_id = database.insert(
DatabaseHelper.TABLE_NAME,
null,
contentValues
);
Toast.makeText(this, "插入数据的id:"+insert_id, Toast.LENGTH_SHORT).show();
}

2. 查-查询记录

① 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* @param table 插入的表
* @param columns 查询的列 没有给null
* @param selection 查询的条件 没有给null
* @param selectionArgs 查询条件的参数值数组 没有给null
* @param groupBy 一般给null
* @param having 一般给null
* @param orderBy 一般给null
* @return 一个Cursor,查询的结果集合
*/
public Cursor query(String table, String[] columns, String selection,
String[] selectionArgs, String groupBy, String having,
String orderBy)

//Cursor使用后需要及时close

② 例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 查询记录
*/
public void find(SQLiteDatabase database){
//Cursor 游标 可以理解为查询的结果集合
Cursor cursor = database.query(DatabaseHelper.TABLE_NAME, null, null, null, null, null, null);

//将游标移动到最开始的位置
if (cursor.moveToFirst()){
for (int i = 0; i < cursor.getCount(); i++) {
//查询数据
String name = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN_NAME));
String password = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN_PASSWORD));
//移动到下一个位置
cursor.moveToNext();

Toast.makeText(this, "用户:"+name+" 密码:"+password, Toast.LENGTH_SHORT).show();
}
}
}

我们之前插入了两条记录:{文小酒,123456},{许小石,123456}

3. 删-删除记录

① 方法

1
2
3
4
5
6
7
/**
* @param table 插入的表
* @param whereClause 删除的条件
* @param whereArgs 删除条件的参数值
* @return 一般情况下是删除记录的数量
*/
public int delete(String table, String whereClause, String[] whereArgs)

② 例子

1
2
3
4
5
6
7
8
9
/**
* 删除记录
*/
public void delete(SQLiteDatabase database){
String whereClaus = DatabaseHelper.COLUMN_PASSWORD+"=?";
String[] whereArgs = {"123456"};

database.delete(DatabaseHelper.TABLE_NAME,whereClaus,whereArgs);
}

两条记录就会被全部清空。

4. 改-更新记录

① 方法

1
2
3
4
5
6
7
8
/**
* @param table 插入的表
* @param table 更新的值
* @param whereClause 更新的条件
* @param whereArgs 更新条件的参数值
* @return 更新记录的数量
*/
public int update(String table, ContentValues values, String whereClause, String[] whereArgs)

② 例子

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 修改记录
*/
public void update(SQLiteDatabase database){
//ContentValues
ContentValues contentValues = new ContentValues();
contentValues.put(DatabaseHelper.COLUMN_PASSWORD,"45678");

String whereClaus = DatabaseHelper.COLUMN_NAME+"=?";
String[] whereArgs = {"文小酒"};

database.update(DatabaseHelper.TABLE_NAME,contentValues,whereClaus,whereArgs);
}

在此之前,我们将删除的记录重新插入了。{文小酒,123456},{许小石,123456}

三. 数据库操作中的事务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 事务
* @param database
*/
private void transactionTest(SQLiteDatabase database) {
//开始事务,此时db会被锁定
database.beginTransaction();

try {
//做你的事情,例如循环插入数据

//设置事务成功,必须要设置
database.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
//结束事务
database.endTransaction();
}
}

四. 对象关系映射 ORM

大部分的数据库第三方库都使用了对象关系映射。

我学习的是LitePal,是从郭霖大佬的博客看到的第三方库,以下是大佬关于该内容的博客:

Android笔记:LitePal库的更新,DataSupport被弃用问题

Android数据库高手秘籍(一)——SQLite命令

Android数据库高手秘籍(二)——创建表和LitePal的基本用法

Android数据库高手秘籍(三)——使用LitePal升级表

Android数据库高手秘籍(四)——使用LitePal建立表关联

Android数据库高手秘籍(五)——LitePal的存储操作

Android数据库高手秘籍(六)——LitePal的修改和删除操作

Android数据库高手秘籍(七)——体验LitePal的查询艺术

Android数据库高手秘籍(八)——使用LitePal的聚合函数

我在我的 连连看开发中使用的就是这个第三方库,参考:Android项目8:连连看

当然还有许多其他优秀的第三方库,参考:Android目前流行三方数据库ORM分析及对比

参考文章

Android 数据库SQLite Cursor数据遍历读取