欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

我的学习篇三:Android 数据库操作复习(简单创建,插入数据,查询数据,Cursor 封装)

程序员文章站 2024-02-11 11:23:46
...

遇到使用Android 自带数据库SQLiteDatabase的场景

这里再学习一下  

++++++++++++++++++++++++++++++++++++++ 漂亮的分割线 ++++++++++++++++++++++++++++++++++++++

基本用法 · 简单操作

(也没有多余的赘述直接干巴巴代码介绍~)  创建类 DBHelper 继承 SQLiteOpenHelper

public class DBHelper extends SQLiteOpenHelper
需要实现两个方法:
onCreate() : 数据库创建过了则不会执行,数据库不存在则会执行
onUpgrade(): 创建数据库时不会执行,增大版本号升级时才会执行到;一般在这里做数据升级时数据迁移操作
    @Override
    public void onCreate(SQLiteDatabase db) {
        
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        
    }

使用单例获取类 DBHelper 实例,并在构造方法中获取 打开数据库

    private static DBHelper helper = null;
    
    private SQLiteDatabase db = null;

    public static DBHelper getInstance(Context context) {
        if (helper == null) {
            helper = new DBHelper(context);
        }
        return helper;
    }

    private DBHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
        if (db == null) {
            db = getWritableDatabase();
        }
        this.context = context;
    }

先定义一些名称及变量:

    /* db 测试页面包名 */
    String DB_TEST_PACHAGE_NAME = "com.example.bianjiangzhou.fristdemo.DBTestActivity";
    /* db 测试页面名称 */
    String DB_TEST_PAGE_TITLE = "DB测试页面";
    //版本号
    private static final int DBVERSION = 1;
    //数据库名称
    private static final String DBNAME = "bian_test.db";
    //表名
    private static final String TABLE_COMMON = "common_table";
    //表名
    private static final String TABLE_CONFIG = "config_table";
    //表名
    private static final String TABLE_PAGE_CONTENT = "page_content_table";
    //定义 表 page_content_table 中的字段
    private class PAGE_CONTENT_TABLE_FIELD {
        /* 页面包名 */
        static final String packageName = "packageName";
        /* 页面名称 */
        static final String pageTitle = "pageTile";
    }

    //创建表语句
    public static final String CREATE_PAGE_CONTENT = "CREATE TABLE " + TABLE_PAGE_CONTENT + "(" +
            "id integer PRIMARY KEY AUTOINCREMENT," +
            PAGE_CONTENT_TABLE_FIELD.packageName + " text," +
            PAGE_CONTENT_TABLE_FIELD.pageTitle + " text)";

    //创建表方法
    private void creatTable(SQLiteDatabase db) {
        db.execSQL(CREATE_PAGE_CONTENT);
    }

不会语句的可以看这个大哥的文章:

https://blog.csdn.net/gary__123456/article/details/76718492

https://blog.csdn.net/gary__123456/article/details/76736132

我们在onCreate方法中调用 创建表的方法;

在onUpgrade方法中 做 DROP 重建表操作

    /* 数据库创建过了则不会执行,数据库不存在则会执行 */
    @Override
    public void onCreate(SQLiteDatabase db) {
        creatTable(db);
    }

    /**
     * 创建数据库时不会执行,增大版本号升级时才会执行到
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        /* 如果数据库中存在xxx_book表,就把它从数据库中drop掉。备份sql中一般都有这样的语句,
           如果是数据库中有这个表,先drop掉,然后create表,然后再进行数据插入。 */
        /* 这里实际上应该数据迁移,暂时还不会下面这句是别的大哥写的,然后去查了什么作用... */
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_PAGE_CONTENT);
        onCreate(db);
    }
接下来我们做一下数据初始化:
public void initTestData() {
        String sql = "INSERT INTO " + TABLE_PAGE_CONTENT +
                "(" + PAGE_CONTENT_TABLE_FIELD.packageName + "," + PAGE_CONTENT_TABLE_FIELD.pageTitle + ")" +
                "VALUES" +
                "(" + "'" + DB_TEST_PACHAGE_NAME + "'" + "," + "'" + DB_TEST_PAGE_TITLE + "'" + ")";
        db.execSQL(sql);
        LogUtil.d("db_test", "insert ok");
    }

接下来进行测试:

创建一个activity页面调用 initTestData() 方法:

DBHelper.getInstance(this).initTestData();

控制台输出信息:

2019-07-25 00:53:23.156 20350-20350/? I/tm-db_test: insert ok

++++++++++++++++++++++++++++++++++++++ 漂亮的分割线 ++++++++++++++++++++++++++++++++++++++

查询测试

我们接下来查询一下表,验证是否数据存入

public void testDataQuery() {
        String sql = "SELECT * FROM " + TABLE_PAGE_CONTENT;
        Cursor cursor = db.rawQuery(sql, null);
        LogUtil.d("db_test", "cursor json -- " + new Gson().toJson(getData(cursor)));
    }

Cursor的用法可以参考这位大哥的博客:

https://www.cnblogs.com/to-creat/p/5189634.html

我封装了将Cursor中的数据去除转化为list集合的方法,不喜欢的直接操作Cursor的同学可以下哈:

/* 我理解的 cursor 中的数据 就是 你查询的字段在上面,查询出的值在下面,跟上方的字段一一对应,然后瀑布下来 */
    /* 所以使用List 嵌套 map 集合,map 的k : 查询的字段, v: 对应的值 */
    public List<Map<String, String>> getData(Cursor cursor) {
        if (cursor == null) {
            return null;
        }
        if (cursor.moveToFirst() == false) {
            //为空的Cursor
            return null;
        }
        LogUtil.d("db_test", "cursor line num: " + cursor.getCount());
        List<Map<String, String>> list = new ArrayList<>();
        /* cursor 指针 moveToFirst 的时候移动了一次,这里需要进行一次 取值*/
        list.add(getMapData(cursor));
        while (cursor.moveToNext()) {
            /* 移动指针,继续取值 */
            list.add(getMapData(cursor));
        }
        return list;
    }

    private Map<String, String> getMapData(Cursor cursor) {
        Map<String, String> map = new HashMap<>();
        /* 返回列的总数 */
        for (int i = 0; i < cursor.getColumnCount(); i++) {
            String k = cursor.getColumnName(i);
            int index = cursor.getColumnIndex(k);
            String v = cursor.getString(index);
            map.put(k, v);
        }
        return map;
    }
好了我们在之前写的测试页面调用方法:
DBHelper.getInstance(this).testDataQuery();

观察控制台输出信息:

2019-07-25 01:45:45.267 24637-24637/? I/tm-db_test: insert ok
2019-07-25 01:45:45.283 24637-24637/? I/tm-db_test: cursor line num: 1
2019-07-25 01:45:45.301 24637-24637/? I/tm-db_test: cursor json -- [{"pageTile":"DB测试页面","id":"1","packageName":"com.example.bianjiangzhou.fristdemo.DBTestActivity"}]

文中代码下载链接:

http://note.youdao.com/noteshare?id=d7f5029aafed6068627d84af61e68e00&sub=013BC8AC674B43D18375310C9AD4C459

ok暂时对于数据库操作的复习就到这里,如果能帮助到您是我的荣幸哦 ~