美文网首页
Android数据持久化篇(三)—— SQLite数据库的使用

Android数据持久化篇(三)—— SQLite数据库的使用

作者: 乌托邦式的爱情 | 来源:发表于2021-08-08 13:16 被阅读0次

    在android开发过程中,除了File和SharedPreference可以进行存储之外,我们还可以使用SQLite来进行数据的持久化操作,与File和SharedPreference操作相比,SQLite可以进行大量数据的存储,而这是File和SharedPreference很难去办到的,因为File和SharedPreference更适合去存储少量的数据,那么对于那种大量的数据存储我们的SQLite数据库就开始闪亮登场了,废话不多说,先看效果。


    sqLite数据库实例.gif

    SqLite的数据库的使用也非常简单,分为下面几步:
    (1)创建类继承自SQLiteOpenHelper并复写里面的几个方法。
    (2)通过getWritableDatabase()或者getReadableDatabase()创建或者打开一个数据库。
    (3)获取SQLite数据库的操作类实例SQLiteDatabase。
    (4)进行增删改查。

    第一步:创建类继承自SQLiteOpenHelper并复写里面的几个方法

    public class DatabaseHelper extends SQLiteOpenHelper {
    
        public static final String CREATE_BOOK = "create table Book("
                + "id integer primary key autoincrement,"
                + "author text,"
                + "price real,"
                + "pages integer,"
                + "name text)";
    
        public static final String CREATE_CATEGORY = "create table Category("
                + "id integer primary key autoincrement,"
                + "category_name text,"
                + "category_code integer)";
    
        private Context mContext;
    
        /**
         * SQLite的数据库构造方法
         *
         * @param context 上下文
         * @param name    数据库名称
         * @param factory 一个可选的游标工厂(通常是 Null)
         * @param version 当前数据库的版本,值必须是整数并且是递增的状态
         */
        public DatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
            this.mContext = context;
        }
    
        /**
         * 对数据库进行初始化操作
         *
         * @param db 数据库操作类
         */
        @Override
        public void onCreate(SQLiteDatabase db) {
            // 创建表名
            db.execSQL(CREATE_BOOK);
            db.execSQL(CREATE_CATEGORY);
            Toast.makeText(mContext, "Book表创建成功", Toast.LENGTH_SHORT).show();
            // 注:数据库实际上是没被创建 / 打开的(因该方法还没调用)
            // 直到getWritableDatabase() / getReadableDatabase() 第一次被调用时才会进行创建 / 打开
        }
    
        /**
         * 数据库版本切换
         *
         * @param db         数据库操作类
         * @param oldVersion 之前的数据库的版本
         * @param newVersion 设置的数据库的版本
         */
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("drop table if exists Book");
            db.execSQL("drop table if exists Category");
            onCreate(db);
        }
    }
    

    在这里需要强调的是onCreate()方法只会执行一次,一般情况下在第一次调用getWritableDatabase()或者getReadableDatabase()的时候会调用,那么当我们在后期需要新增表的时候咋办呢?解决办法有两种:
    (1)卸载程序重装(不建议使用)。
    (2)更新数据库的版本(推荐使用),在更换数据库版本的时候需要在onUpgrade()方法里面去删除之前存在的表,然后再次创建新的表。

    第二步:通过getWritableDatabase()或者getReadableDatabase()创建或者打开一个数据库。

    DatabaseHelper mDatabaseHelper = new DatabaseHelper(IApplication.getContext(), "Book.db", null, 1);
    

    需要注意的是,在构造函数里面,第一个传递的是上下文,第二个传递的是数据库的名字,第三个是一个可选的游标工厂,通常情况下设置为null就可以了,第四个参数代表的是当前数据库的版本。

    第三步:获取SQLite数据库的操作类实例SQLiteDatabase

    SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
    

    需要说明的是:
    getReadableDatabase()和getWritableDatabase()都可以创建或者打开一个数据库。
    如果数据库存在则直接打开,如果不存在则直接创建。同时返回一个可对数据库进行读写操作的对象。
    二者不同的是,当数据库不可写入的时候(比如磁盘空间已满),getReadableDatabase()方法返回的
    对象将以只读的方式去打开数据库,而getWritableDatabase()方法将出现异常。

    第四步:进行增删改查

    /**
     * 插入数据
     */
    public void insertData() {
        ContentValues contentValues = new ContentValues();
        // 开始组装第一条数据
        contentValues.put("name", "android开发艺术");
        contentValues.put("author", "任玉刚");
        contentValues.put("price", 88.8);
        contentValues.put("pages", 778);
        long result = db.insert("Book", null, contentValues);
        if (result > -1) {
            Toast.makeText(IApplication.getContext(), "插入数据成功", Toast.LENGTH_LONG).show();
        }
    }
    
    /**
     * 修改数据
     */
    public void updateData() {
        ContentValues contentValues = new ContentValues();
        contentValues.put("price", 66.6);
        // String table, ContentValues values, String whereClause, String[] whereArgs
        // 第一个参数对应的是表名
        // 第二个参数对应的是修改内容
        // 第三、四个参数对应的是约束的条件
        long result = db.update("Book", contentValues, "author=?", new String[]{"任玉刚"});
        if (result > -1) {
            Toast.makeText(IApplication.getContext(), "修改数据成功", Toast.LENGTH_LONG).show();
        }
    }
    
    /**
     * 删除数据
     */
    public void deleteData() {
        // 第一个参数对应的是表名
        // 第二、三个参数对应的是约束的条件
        long result = db.delete("Book", "pages>?", new String[]{"500"});
        if (result > -1) {
            Toast.makeText(IApplication.getContext(), "删除数据成功", Toast.LENGTH_LONG).show();
        }
    }
    
    public void queryData() {
        // String table, String[] columns, String selection,String[] selectionArgs, String groupBy, String having,String orderBy
        // 第一个参数代表的是表名
        // 第二个参数代表的是查询的列名
        // 第三个参数代表的是指定where的约束条件
        // 第四个参数代表的是为where中指定的占位符提供具体的值
        // 第五个参数代表的是指定需要group by的列
        // 第六个参数代表的是对group by后的结果进一步约束
        // 第七个参数代表的是指定查询结果的排序方式
        Cursor cursor = db.query("Book", null, null, null, null, null, null);
        if (cursor.moveToFirst()) {
            do {
                // 遍历Cursor对象,取出数据
                String name = cursor.getString(cursor.getColumnIndex("name"));
                String author = cursor.getString(cursor.getColumnIndex("author"));
                int pages = cursor.getInt(cursor.getColumnIndex("pages"));
                double prices = cursor.getDouble(cursor.getColumnIndex("price"));
                String showValue = "书名:" + name + "\t作者名:" + author + "\t总页数:" + pages + "\t价格:" + prices;
                Toast.makeText(IApplication.getContext(), showValue, Toast.LENGTH_LONG).show();
            } while (cursor.moveToNext());
        }
        cursor.close();
    }
    

    需要强调的两点是:
    1》数据库文件会放在data/data/包名/databases目录下面
    2》创建表的时候:
    (1)integer表示整型
    (2)real表示浮点型
    (3)text表示文本类型
    (4)blob表示二进制类型
    (5)primary key设为主键
    (6)autoincrement自增长

    总结:SQLite的数据库相对来说稍微复杂一点,因为这和后端的数据库的操作其实并没有太多区别,一样有着增删改查,而麻烦的往往就是自己去实现sql语句,那么有没有什么办法可以避免这种直接的数据库操作呢?答案是有的,下一篇我们继续来了解一下不用写sql语句的数据库操作。

    相关文章

      网友评论

          本文标题:Android数据持久化篇(三)—— SQLite数据库的使用

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