Android SQLiteOpenHelper 总结

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();

猜你喜欢

转载自blog.csdn.net/xiao6gui/article/details/80815034