美文网首页Android开发学习Android基础
Android数据存储之SQLite存储

Android数据存储之SQLite存储

作者: Android_董 | 来源:发表于2020-02-04 15:04 被阅读0次

    目录

    1、介绍
    2、路径
    3、创建数据库
    4、升级数据库
    5、添加数据
    6、修改数据
    7、删除数据
    8、查询数据

    • 介绍

    SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用源很少,通常只需要几百KB的内存就足够了,因而特别适合在移动设备上使用。
    SQLite不仅支持标准的SQL语法,还遵循数据库的ACID事务,所以只要你以前使用过其他的关系型数据库,就可以很快地上手 SQLite。
    SQLite比一般的数据库要简单得多,它甚至不用设置用户名和密码就可以使用。
    Android正是把这个功能极为强大的数据库嵌入到了系统当中,使得本地持久化的功能有了一次质的飞跃。

    • 路径

    /data/data/<package name>/databases/

    • 创建数据库

    Android提供了SQLiteOpenHelper帮助类用于实现数据库的创建和升级
    实现两个抽象方法onCreate()、onUpgrade()

    新建MyDataBaseHelper继承SQLiteOpenHelper
    public class MyDataBaseHelper extends SQLiteOpenHelper {
        private Context mConetx;
        public static String CREATE_BOOK = "create table Book(" +
                "id integer primary key autoincrement," +
                "author text," +
                "name text)";
    
        public MyDataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
            mConetx = context;
        }
    
        //创建数据库
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_BOOK);
            Toast.makeText(mConetx, "创建数据库成功", Toast.LENGTH_SHORT).show();
        }
    
        //升级数据库
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    }
    
    
    创建数据库
    MyDataBaseHelper myDataBaseHelper = new MyDataBaseHelper(FileActivity.this, "DongBo.db", null, 1);
    //创建数据库
    myDataBaseHelper.getWritableDatabase();
    
    /**
         *
         * @param context 上下文
         * @param name 数据库名
         * @param factory  允许我们在查询数据的时候返回一个自定义的 Cursor,一般都是传入 null
         * @param version 版本号,若升级数据库版本号需+1
         */
        public MyDataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
        }
    
    • 升级数据库

    创建新的表
     public static final String CREATE_CITY = "create table City(" +
                "id integer primary key autoincrement," +
                "author text," +
                "age integer," +
                "city text)";
    
     @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_CITY);
            db.execSQL(CREATE_BOOK);
            Toast.makeText(mConetx, "创建数据库成功", Toast.LENGTH_SHORT).show();
        }
    
    将版本号递增
    MyDataBaseHelper myDataBaseHelper = new MyDataBaseHelper(FileActivity.this, "DongBo.db", null, 2);
    

    问题一

    我们会发现并没有创建新的表,是因为只有第一次创建数据库时会调用onCreate(),之后不会再调用onCreate()

    修改

    在onUpgrade()中判断若当前表存在则删除表之后再调用onCreate()

    @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("drop table if exists City");
            db.execSQL("drop table if exists Book");
            onCreate(db);
        }
    
    • 添加数据

    SQLiteDatabase提供了insert()来进行数据的添加

    /**
         *
         * @param table 表名
         * @param nullColumnHack  用于在未指定添加数据的情况下给某些可为空的列自动赋值NULL,我们一般直接传入null
         * @param values  一个ContentValues对象,调用put方法来添加数据
         * @return
         */
        public long insert(String table, String nullColumnHack, ContentValues values) {}
    
    mBtnSqInsert.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    ContentValues value = new ContentValues();
                    value.put("author", "罗贯中");
                    value.put("name", "三国演义");
                    db.insert("Book", null, value);
                    value.clear();
                    value.put("author", "曹雪芹");
                    value.put("name", "红楼梦");
                    db.insert("Book", null, value);
                }
            });
    
    • 修改数据

    SQLiteDatabase提供了update()来进行数据的修改

    /**
         *
         * @param table 表名
         * @param values 一个ContentValues对象,将更新的数据添加进去,key需要对应数据库中的key
         * @param whereClause 修改的条件 key = ? 
         * @param whereArgs 修改条件的值,按照修改的条件依次顺序
         * @return
         */
        public int update(String table, ContentValues values, String whereClause, String[] whereArgs) {}
    
     mBtnSqUpdateData.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    db = myDataBaseHelper.getWritableDatabase();
                    ContentValues values = new ContentValues();
                    values.put("name", "董博");
                    db.update("Book", values, "author = ?", new String[]{"罗贯中"});
                }
            });
    
    • 删除数据

    SQLiteDatabase提供了delete()来进行数据的删除

    /**
         *
         * @param table 表明
         * @param whereClause  删除的条件 key = ?
         * @param whereArgs 删除条件的值,按照修改的条件依次顺序
         * @return
         */
        public int delete(String table, String whereClause, String[] whereArgs) {}
    
    mBtnSqDelete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    db = myDataBaseHelper.getWritableDatabase();
                    db.delete("Book", "id = ?", new String[]{"1"});
                }
            });
    
    • 查询数据

    SQLiteDatabase提供了query()来进行数据的查询

    /**
         *
         * @param table 表明
         * @param columns  指定查询的列名(默认所有列)
         * @param selection 用于约束查询某一行或某几行的数据(默认查询所有行)
         * @param selectionArgs  用于约束查询某一行或某几行的数据(默认查询所有行)
         * @param groupBy 指定需要group by的列,不指定则不进行group by操作
         * @param having 对group by之后的数据进一步过滤
         * @param orderBy 指定查询结果的排序方式
         * @return
         */
        public Cursor query(String table, String[] columns, String selection,
    
                            String[] selectionArgs, String groupBy, String having,
                            String orderBy) {}
    
     mBtnSqQuery.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    db = myDataBaseHelper.getWritableDatabase();
                    Cursor cursor = db.query("Book", null, null, null, null, null, null);
    
                    if (cursor.moveToFirst()) {
                        do {
                            String author = cursor.getString(cursor.getColumnIndex("author"));
                            String name = cursor.getString(cursor.getColumnIndex("name"));
                            Log.e("author", author);
                            Log.e("name", name);
                        } while (cursor.moveToNext());
                    }
                    cursor.close();
    
                }
            });
    

    这里除过第一个参数表名天界,其他的传null,表示查询所有数据,查询之后的到Cursor对象,先调用moveToFirst()将指针移到第一条,然后通过循环遍历每条数据,通过cursor.getColumnIndex()获取表中对应的位置索引,然后传入索引获取值,最后调用close()关闭Cursor。

    这篇只是对数据库的一个简单的使用,还有很多需要学习的地方,像sqlite语句的写法还需要好好的研究一波,在项目中一般前端用到数据库的地方不是很常见,但是多学习一些,对我们也有好处,大家可以看下GreenDao

    若有不足,请大家指教

    数据存储相关文章
    Android数据存储之文件存储
    Android数据存储之SharedPreferences
    Android数据存储之SQLite存储

    相关文章

      网友评论

        本文标题:Android数据存储之SQLite存储

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