在整理ContentProvider知识点之前要先整理Sqlite数据库的知识,因为ContentProvider中要使用到数据库

步入正题:Sqlite的起源是一艘军舰上,一个数据库程序员觉得潜艇正在使用的数据库太过强大,每次更新升级操作复杂,耗时,效率不高。然后就想优化,目标就是设计出一个结构功能简单,操作简单,独立性强的数据库,因为也是开源的,之后就在开源社区流行起来,很多开发者都开始使用sqlite数据库。很适合手机移动端

定义:Sqlite是是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,是为了嵌入式系统。

特点:体积小,轻量级,独立不依赖其他,简洁。效率高。

Sqlite数据库的数据类型:android sqlite支持的数据类型_seekrg的博客-CSDN博客    看到这位介绍的还不错就不做赘述了,未考证其内容,请谨慎参考。

最新出现了一个新的数据库 ,GreenDAO团队出了一个基于对象的数据库处理库ObjectBox,不再是sqlite数据库,速度快,使用方便,不用数据库版本更新。新项目应该拥抱ObjectBox,旧项目的greendao也可以转objectbox。可以去官网看使用文档,当你掉进坑里的时候,可以看一下我另一篇文章:Android ObjectBox 数据库避坑Duplicate files copied in APK lib/armeabi-v7a/libobjectbox.so_Android_周志豪378623234的博客-CSDN博客

1.Sqlite数据库的创建

继承SqliteOpenHelper 数据库助手类,重写onCreate方法,创建表的语句就写在这里

package com.zhouzhihao.test.database;

import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Build;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;

/**
 * description:
 *
 * @author zhouzhihao
 * @time 2020/12/4 0004
 */
public class DbHelper extends SQLiteOpenHelper {
    public DbHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    public DbHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version, @Nullable DatabaseErrorHandler errorHandler) {
        super(context, name, factory, version, errorHandler);
    }

    @RequiresApi(api = Build.VERSION_CODES.P)
    public DbHelper(@Nullable Context context, @Nullable String name, int version, @NonNull SQLiteDatabase.OpenParams openParams) {
        super(context, name, version, openParams);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql="create table user (id integer primary key autoincrement, name text(4),address text(5))";
        db.execSQL(sql);
        //版本4改动
        String sql1="create table testid (_id integer primary key autoincrement, name text(4))";
        db.execSQL(sql1);
    }

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

        switch (newVersion){
            case 2:
                //版本2改动,没有break 所以版本4改动也会一层层执行
            case 4:
                //版本4改动
                String sql1="create table testid (_id integer primary key autoincrement, name text(4))";
                db.execSQL(sql1);
        }

    }
}

使用数据库的类中调用,test是数据库名称,4是版本号

 dBhelper=new DbHelper(this,"test",null,4);

2.增删改查

 SQLiteDatabase dataBase = dBhelper.getWritableDatabase();

        try {
            //创建存放数据的ContentValues对象
            ContentValues values = new ContentValues();
            values.put("name","zhou");
            //数据库执行插入命令
            dataBase.insert("user", null, values);
            String name="lili",address="广东省广州市";
            String sql="insert into user (name,address) values ('"+name+"','"+address+"')";
            dataBase.execSQL(sql);
            //删除
            //方式二
            dataBase.delete("user", "name = ? or address = ?", new String[]{"zhouzhihao"});
            String sql1="delete from user where name='lili'";
            dataBase.execSQL(sql1);
            //修改
            ContentValues contentValues=new ContentValues();
            contentValues.put("address","河南焦作");
            dataBase.update("user",contentValues, "name=?",new String[]{"zhou"});
            //方式二
            String sql2="update user set address='广东' where name='zhou'";
            dataBase.execSQL(sql2);
            //查看
            Cursor cursor=dataBase.rawQuery("select * from user",null);
            //方式二
            cursor=dataBase.query("user",new String[]{"id","name","address"},"id=?",new String[]{"11"},null,null,null,null);
            ArrayList<User> dats = new ArrayList<>();

            while (cursor.moveToNext()) {
                User user = new User();
                int id = cursor.getInt(cursor.getColumnIndex("id"));
                String name_temp = cursor.getString(cursor.getColumnIndex("name"));
                String address_temp = cursor.getString(cursor.getColumnIndex("address"));
                user.setId(id);
                user.setName(name_temp);
                user.setAddress(address_temp);
                dats.add(user);
            }
            cursor.close();

记得cursor 调用close关闭,释放资源。

3.数据库版本更新维护

重点分析:onCreate 只在版本创建的时候调用,onUpgrade 只在数据库更新时调用,所以会有版本1升级成版本2,版本2升级成版本4,版本1升级成版本4,直接装上去就是版本4等诸多情况

我们的目的就是使所有情况在代码执行完,数据库都是完整的两张表,那么就要再onCreate和onUpgrade 存在两份相同的代码,但用户的各种情况只会执行一份。注意:switch后面的case没有break,这样才不会出现跨版本更新时,有部分代码漏掉的情况。

  @Override
    public void onCreate(SQLiteDatabase db) {
        String sql="create table user (id integer primary key autoincrement, name text(4),address text(5))";
        db.execSQL(sql);
        //版本4改动
        String sql1="create table testid (_id integer primary key autoincrement, name text(4))";
        db.execSQL(sql1);
    }

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

        switch (newVersion){
            case 2:
                //版本2改动,没有break 所以版本4改动也会一层层执行
            case 4:
                //版本4改动
                String sql1="create table testid (_id integer primary key autoincrement, name text(4))";
                db.execSQL(sql1);
        }

    }

最后,最后安利一下Android Studio 的数据库查看工具,太好用了,很多人不知道新版更新了这个功能:

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐