SQLite数据库介绍
SQLite是Android内置的一个小型、关系型、属于文本型的数据库。
Android提供了对 SQLite数据库的完全支持,应用程序中的任何类都可以通过名称来访问任何的数据库,但是应用程序之外的就不能访问。
Android中,通过SQLiteOpenHelper类来实现对SQLite数据库的操作。
SQLiteOpenHelper
一个用于数据库创建和版本管理的辅助类
// 构造方法
// 数据库存在就打开数据库,数据库不存在就新建
// SQLiteDatabase.CursorFactory 用于创建 cursor ,传入 null 则使用默认的 cursor
SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
常见操作###
- 对于“增、删、改(更新)”这类对表内容变换的操作,需先调用getWritableDatabase()获得一个可写数据库对象,在执行的时候调用通用的execSQL(String sql)或或对应的操作API方法:insert()、delete()、update()
- 对“查”,需要调用getReadableDatabase()获得一个可读的数据库对象,然后使用query()或rawQuery()方法 ,查询数据库不能使用execSQL方法
创建数据库####
public class CrimeSqlLiteHelper extends SQLiteOpenHelper {
// 整个应用的数据库名称
private static final String DATABASE_NAME = "crimes.db";
// 整个应用的数据库版本号
private static final int VERSION = 1;
// SQLiteDatabase.CursorFactory 传 null,使用默认 cursor
public CrimeSqlLiteHelper(Context context) {
super(context, DATABASE_NAME, null, VERSION);
}
/**
* 打开或者创建数据库,这里我们只是创建了一张 Crime 表,直到 getReadableDatabase/getWriteableDatabase 其中
* 一个方法被调用,才会真正的创建数据库
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + CrimeTableSchema.TABLE_NAME + "(" +
" _id integer primary key autoincrement, " +
CrimeTableSchema.COLS_UUID + ", " +
CrimeTableSchema.COLS_TITLE + ", " +
CrimeTableSchema.COLS_DATE + ", " +
CrimeTableSchema.COLS_SOLVED +
")");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
插入数据####
// table 表名
// 如果提供的值为空, 则不知道列名, 并且无法插入空行。如果未设置为 null, 则 nullColumnHack 参数提供可空列名的名称,
// 以便在值为空的情况下显式插入 null。用于处理空值
// ContentValues 包含列表数据的集合,key 是 Colum 名称,value是对应的值
insert(String table, String nullColumnHack, ContentValues values)
// 获取数据库
Context newContext = context.getApplicationContext();
mDatabase = new CrimeSqlLiteHelper(newContext).getReadableDatabase();
// 构建一个 ContentValues 用于向数据库插入数据
private ContentValues getContentValues(Crime crime) {
ContentValues contentValues = new ContentValues();
contentValues.put(CrimeTableSchema.COLS_UUID, crime.getID().toString());
contentValues.put(CrimeTableSchema.COLS_TITLE, crime.getTitle());
contentValues.put(CrimeTableSchema.COLS_DATE, crime.getDate().getTime());
contentValues.put(CrimeTableSchema.COLS_SOLVED, crime.isSolved() ? 1 : 0);
return contentValues;
}
// 插入数据
public void addCrime(Crime crime) {
ContentValues values = getContentValues(crime);
mDatabase.insert(CrimeTableSchema.TABLE_NAME, null, values);
}
Update数据####
public int update (String table,
ContentValues values,
String whereClause,
String[] whereArgs)
ContentValues contentValues = getContentValues(crime);
String uuid = crime.getID().toString();
// 第三个参数String:WHERE表达式,where选择语句, 选择那些行进行数据的更新, 如果该参数为 null, 就会修改所有行;?号是占位符
// 第四个参数String[]:where选择语句的参数, 逐个替换 whereClause 中的占位符;
mDatabase.update(CrimeTableSchema.TABLE_NAME, contentValues, CrimeTableSchema.COLS_UUID + "= ?", new String[]{uuid});
delete数据####
// 第二个参数,条件选择,选中的行进行删除,如果为 null , 删除所有行
// 第三个参数,条件选择语句的参数
public int delete (String table, String whereClause, String[] whereArgs)
/**
* 删除数据
* @param uuid 根据 uuid 来删除数据
*/
public void deleteCrime(UUID uuid) {
mDatabase.delete(CrimeTableSchema.TABLE_NAME, CrimeTableSchema.COLS_UUID + "= ?", new String[]{uuid.toString()});
}
查询数据####
// 第一个参数String:表名
// 第二个参数String[]:要查询的列名
// 第三个参数String:查询条件
// 第四个参数String[]:查询条件的参数
// 第五个参数String:对查询的结果进行分组
// 第六个参数String:对分组的结果进行限制
// 第七个参数String:对查询的结果进行排序
public Cursor query (
String table, //String:表名
String[] columns, // String[]:要查询的列名,null则查询全部
String selection, // 查询条件
String[] selectionArgs, //String[]:查询条件的参数
String groupBy, // 对查询的结果进行分组
String having, // 对分组的结果进行限制
String orderBy, //对查询的结果进行排序
String limit)// 条目数限定
private CrimeCursor queryCrimes(String whereClause, String[] whereArgs) {
Cursor cursor = mDatabase.query(CrimeTableSchema.TABLE_NAME,
null,
whereClause,
whereArgs,
null, null, null);
return new CrimeCursor(cursor);
}
/**
* 查询全部的 Crime
*
* @return
*/
public List<Crime> getCrimes() {
List<Crime> crimes = new ArrayList<>();
// 释放资源
try (CrimeCursor crimeCursor = queryCrimes(null, null)) {
crimeCursor.moveToFirst();
while (!crimeCursor.isAfterLast()) {
crimes.add(crimeCursor.getCrime());
crimeCursor.moveToNext();
}
}
return crimes;
}
// 将 cursor 进行包装
public class CrimeCursor extends CursorWrapper {
/**
* Creates a cursor wrapper.
*
* @param cursor The underlying cursor to wrap.
*/
public CrimeCursor(Cursor cursor) {
super(cursor);
}
/**
* 获取一条具体的 Crime
*
* @return 查询到的 Crime
*/
public Crime getCrime() {
String uuid = getString(getColumnIndex(CrimeTableSchema.COLS_UUID));
String title = getString(getColumnIndex(CrimeTableSchema.COLS_TITLE));
long date = getLong(getColumnIndex(CrimeTableSchema.COLS_DATE));
int solved = getInt(getColumnIndex(CrimeTableSchema.COLS_SOLVED));
Crime crime = new Crime(UUID.fromString(uuid));
crime.setSolved(solved == 1);
crime.setTitle(title);
crime.setDate(new Date(date));
return crime;
}
}
关闭数据库
mDatabase.close();
网友评论