美文网首页
Android 基础:SQLite数据库使用和原理分析

Android 基础:SQLite数据库使用和原理分析

作者: 红发_SHANKS | 来源:发表于2018-07-11 14:06 被阅读23次

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

    相关文章

      网友评论

          本文标题:Android 基础:SQLite数据库使用和原理分析

          本文链接:https://www.haomeiwen.com/subject/uujhpftx.html