第十四章 SQLite数据库
- 相关步骤:
- 新建类,定义数据表的表名及表头字段。
- 定义创建数据库的类
- 向数据库中写入数据
- 读取数据库中的数据
定义表名及表头字段
public class CrimeDbSchema {
public static final class CrimeTable{
public static final String NAME = "crimes";
public static final class Cols{
public static final String UUID = "uuid";
public static final String TITLE = "title";
public static final String DATE = "date";
public static final String SOLVED = "solved";
}
}
}
定义创建数据库的类
调用该方法,
CrimeBaseHelper
会做如下工作。
- 打开数据库,如果不存在则新建一个
- 如果是首次创建,则调用onCreate方法,然后保存最新版本号。
- 如果已经创建过,首先检查版本号。然后决定是否升级
- 该类继承自
SQLiteOpenHelper
public class CrimeBaseHelper extends SQLiteOpenHelper {
private static final String DATEBASE_NAME = "crimeBase.db";
private static final int VESION = 1;
public CrimeBaseHelper(Context context) {
super(context, DATEBASE_NAME, null, VESION); //第二个参数传入要创建数据库的名字,
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(String.format( "create table %s( _id integer primary key autoincrement, %s, %s, %s, %s, %s)",
CrimeTable.NAME,//引入前面定义的表格名及字段名称,在数据库中创建表格
CrimeTable.Cols.UUID,
CrimeTable.Cols.TITLE,
CrimeTable.Cols.DATE,
CrimeTable.Cols.SOLVED,
CrimeTable.Cols.SUSPECT
)
);
/*db.execSQL("create table " + CrimeTable.NAME + "(" +
" _id integer primary key autoincrement, " +
CrimeTable.Cols.UUID + "," +
CrimeTable.Cols.TITLE + ", " +
CrimeTable.Cols.DATE + ", " +
CrimeTable.Cols.SOLVED +
")"
);*/
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
向数据库中写入数据
- 创建数据库对象
SQLiteDatabase
mContext = context.getApplicationContext();
mDatabase = new CrimeBaseHelper(mContext)
.getWritableDatabase();
- 实行写入数据库和更新的辅助类是
ContentValues
。
- 他是一种键值对形式的储存类型,其只能用于处理SQLite数据。
- 通过将数据的记录转化成ContentValues,在数据的单例中创建该对象实例。
private static ContentValues getContentValues(Crime crime){
ContentValues values = new ContentValues();
values.put(CrimeTable.Cols.UUID, crime.getId().toString());
values.put(CrimeTable.Cols.TITLE, crime.getTitle());
values.put(CrimeTable.Cols.DATE, crime.getDate().getTime());
values.put(CrimeTable.Cols.SOLVED, crime.isSolved() ? 1 : 0);
return values;
}
- 插入记录
insert(String, String, ContentValues);
//第一个参数为表名,第三个是要写入到数据,第二个参数暂时写为null,先不管。。
- 删除记录
delete(String,String,String[]);
//表名,列名,列的值(以数组形式给出)
- 更新记录
update(String,String,String[]);
public void addCrime(Crime c){
ContentValues values = getContentValues(c);
mDatabase.insert(CrimeTable.NAME, null, values);
}
public void updateCrime(Crime crime){
String uuidString = crime.getId().toString();
ContentValues values = getContentValues(crime);
mDatabase.update(CrimeTable.NAME, values,
CrimeTable.Cols.UUID + " = ?",
new String[] { uuidString } );
}
public void deletCrime(Crime crime){
String uuidString = crime.getId().toString();
mDatabase.delete(CrimeTable.NAME,
CrimeTable.Cols.UUID + " = ? ",
new String[] {uuidString});
}
读取数据库中的数据
- 步骤:
- 需创建一个Cursor的封装类
CursorWrapper
- 使用这个封装类
- 创建:
public class CrimeCursorWrapper extends CursorWrapper {
CrimeCursorWrapper(Cursor cursor) {
super(cursor);
}
public Crime getCrime(){
String uuidString = getString(getColumnIndex(CrimeTable.Cols.UUID));//返回当前列的索引列的字符串值
String title = getString(getColumnIndex(CrimeTable.Cols.TITLE));
long date = getLong(getColumnIndex(CrimeTable.Cols.DATE));
int isSolved = getInt(getColumnIndex(CrimeTable.Cols.SOLVED));
Crime crime = new Crime(UUID.fromString(uuidString)); //传入UUID的键,返回
crime.setTitle(title);
crime.setDate(new Date(date));
crime.setSolved(isSolved != 0);
return crime;
}
}
- 使用:
@NonNull
private CrimeCursorWrapper queryCrimes(String whereClause, String[] whereArgs){
Cursor cursor = mDatabase.query(
CrimeTable.NAME, //表名
null,//selects all columns
whereClause,
whereArgs,
null,
null,
null
);
return new CrimeCursorWrapper(cursor);
}
- 返回列表
public List<Crime> getCrimes() {
List<Crime> crimes = new ArrayList<>();
CrimeCursorWrapper cursor = queryCrimes(null, null);
try {
cursor.moveToFirst(); //将光标移动到第一行
while (!cursor.isAfterLast()){ //若不是最后一行
crimes.add(cursor.getCrime());
cursor.moveToNext(); //向下移动
}
} finally {
cursor.close(); //最后记得关闭cursor
}
return crimes;
}
- 查询单个列表项
public Crime getCrime(UUID id) {
CrimeCursorWrapper cursor = queryCrimes(
CrimeTable.Cols.UUID + " = ?",
new String[] {id.toString()} //查询语句
);
try {
if(cursor.getCount() == 0){
return null;
}
cursor.moveToFirst();
return cursor.getCrime();
} finally {
cursor.close();
}
}
相关小记
- 实践中遵循以下步骤
- 确认目标数据库是否存在
- 如果不存在,首先创建数据库,然后创建数据表并初始化数据。
- 如果存在。打开并确认是否为最新版本
- 若为旧版本,就先升级到最新版本
- 若更新的版本内容较少,可通过直接卸载程序达到清除数据库的目的。
- 在fragment实例通过在
onPause()
方法中更新数据。
挑战练习
- 使用数据库实现删除功能
case R.id.delet_crime:
CrimeLab.get(getActivity()).deletCrime(mCrime);
getActivity().finish();
return true;