SQLite数据库的使用
app通常需要保存一些有用的数据在本地,如果数据量小,比如app的一些配置信息,可以考虑使用轻量级的SharedPreferences来保存。如果数据量大,且要进行复杂的操作,则可能需要使用数据库来保存数据,而SQLite是Android系统默认支持的一款数据库。
业务描述:这篇文章里我们试图来完成这样一个业务,app支持多账号切换,且每个账号都会产生一些训练(比如跳绳)数据,当app没有联网时,把训练数据暂时保存到本地,当连上网络时,就上传训练数据然后清空本地训练数据,这样即使没有网络,也不至于造成训练数据的丢失,且可保证app正常使用。这个业务使用SharedPreferences来保存数据显然不太合适,因为每个账号都会产生数据,且数据量可能比较大,而且要把账号资料和训练数据对应起来,使用关系型数据库最合适不过了。
业务分析:根据以上业务,可以知道这个数据库里至少需要两个表,一个是用户表,一个是训练表。
表结构设计:
- 用户表:用户id,用户昵称、性别 等等
- 训练表: 用户id, 训练时间,训练个数 等等
根据以上分析,就可以着手建立数据库了。
1. 基础使用
1.1 SQLiteOpenHelper
SQLiteOpenHelper是一个用来创建数据库,及对数据库进行版本管理的类。
我们首先要做的就是自定义一个类来继承它,然后实现它的构造方法,数据库创建方法,及版本升级方法。如下:
public class MyDataBaseHelper extends SQLiteOpenHelper {
private static final String TAG = "MyDataBaseHelper";
private static final int DB_VERSION = 1;
private static final String DB_NAME = "mydb.db";
public MyDataBaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
Log.e(TAG, "onCreate SQLite");
sqLiteDatabase.execSQL(UserTable.SQL_CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
Log.e(TAG, "onUpgrade SQLite -->> oldVersion = " + oldVersion + " ; newVersion = " + newVersion);
}
}
这里我们定义了一个MyDataBaseHelper 类来继承SQLiteOpenHelper类,并在这个类里定义了数据库的名称 DB_NAME ,定义了数据库版本号 DB_VERSION ,实现了构造方法,并重写了数据库的创建方法 onCreate 和版本升级方法 onUpgrade。数据表生成语句就在在 onCreate 方法里执行。这里只生成了一个用户表,训练表等后面版本升级的时候再添加,以模拟版本升级时添加数据表的操作。
1.2 定义数据及数据表
我们把数据表的定义全放在同一个类里,以方便管理。如下:
public final class TablesContract {
private TablesContract(){
//防止被初始化
}
public static class UserTable implements BaseColumns{
//user表名 字段名 及 建表语句
public static final String TABLE_NAME = "table_user";
public static final String COLUMN_ID = "user_id";
public static final String COLUMN_NAME = "user_name";
public static final String COLUMN_GENDER = "user_gender";
public static final String COLUMN_AGE = "user_age";
public static final String SQL_CREATE_TABLE = "create table if not exists " + TABLE_NAME + " ( "
+ COLUMN_ID + " text not null,"
+ COLUMN_NAME + " text not null,"
+ COLUMN_GENDER + " integer,"
+ COLUMN_AGE + " integer)";
}
}
自定义了一个 TablesContract 类,在里面定义了 用户资料表的 表名、字段名及SQL建表语句,目前用户表的字段有:用户id、用户名、性别、年龄 。如果数据库还需要添加其它表,也可以同样的方式定义在这个类里。
同时,对应用户表的字段定义一个用户对象类,如下:
public class UserBean {
private String id;
private String name;
private int gender;
private int age;
public UserBean(String id, String name, int gender, int age) {
this.id = id;
this.name = name;
this.gender = gender;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
... ...
@Override
public String toString() {
return "UserBean{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", gender=" + gender +
", age=" + age +
'}';
}
}
示例代码省略了一些get、set方法,就不全部放上来了。
1.3 定义一个数据库操作类
定义这个类,主要是为了把数据库与上层应用分离开,使用的时候不必考虑数据库操作详情,只需要调用相应的方法就可以存取、删改数据。
如下:
public class MyDatabaseOperator {
private static SQLiteOpenHelper openHelper;
public