美文网首页
Android-数据库Room框架的简单使用

Android-数据库Room框架的简单使用

作者: 晴天ccc | 来源:发表于2020-07-10 11:21 被阅读0次

目录

  • 前言
  • Room的基本使用
    ---- 添加依赖
    ---- 创建实体类
    ---- 创建数据访问对象 (DAO)进行增删改查
    ---- 创建数据库Room基础类
    ---- 创建数据库业务管理类
    ---- 在Activity类中使用Room
  • Room数据库升级

前言

Room属于Google推出的JetPack组件库中的数据库框架。
Room 持久性库在 SQLite 之上提供了一个抽象层,以允许流畅的数据库访问,同时利用 SQLite 的全部功能。

  • 方便的注释,最大限度地减少重复和容易出错的样板代码。
  • SQL 查询的编译时验证。
  • 简化的数据库迁移路径。

Room的基本使用

  • 添加依赖

build.gradle中添加依赖

    dependencies {
        //Room数据库框架
        def room_version ="2.4.1"
        implementation "androidx.room:room-runtime:$room_version"
        annotationProcessor "androidx.room:room-compiler:$room_version"

        // 可选 - Kotlin扩展和协程支持
        implementation "androidx.room:room-ktx:$room_version"

        // 可选 - RxJava 支持
        implementation "androidx.room:room-rxjava2:$room_version"

        // 可选 - Guava 支持, including Optional and ListenableFuture
        implementation "androidx.room:room-guava:$room_version"

        // 测试帮助
        testImplementation "androidx.room:room-testing:$room_version"
    }
 
  • 创建实体类

创建Person

import androidx.room.Entity;
import androidx.room.Ignore;
import androidx.room.PrimaryKey;

@Entity
public class Person {

    @PrimaryKey(autoGenerate = true)
    public int id;                          // 自增ID,不做事务处理

    private int personId;                   // 本次主键ID。
    private long createTime;                // 创建时间(时间戳)

    public String realName;                 // 姓名
    public int sex = 0;                     // 性别(0:女,1:男)默认为女
    public long birthday;                   // 生日(时间戳)
    public String phone = "";               // 手机号
    public String country = "";             // 国家Str
    public String provinceStr = "";         // 省Str
    public String cityStr = "";             // 市Str
    public String address = "";             // 详细地址

    @Ignore
    public String nickname;                 //@Ignore 此属性不在数据库生产列
}
}
  • 使用@Entity对类进行注释。
  • 使用@ PrimaryKey对主键进行注释。
  • 设置主键
   @PrimaryKey(autoGenerate = true)
   public int id;                          // 自增ID,不做事务处理
  • 设置 tableName or name 属性
@Entity(tableName = "PersonTable")  // 在数据库中,表名称为:PersonTable
public class Person {

    @PrimaryKey(autoGenerate = true)
    public int id;                          // 自增ID,不做事务处理

    private int personId;                   // 本次主键ID。
    private long createTime;                // 创建时间(时间戳)
 
    @ColumnInfo(name = "name")
    public String mName;                    //@ColumnInfo 在数据库中 mName => name
 
}
  • 在数据库中,表名称为:PersonTable
  • 在数据库中,mName的字段用name表示,mName => name
  • 忽略字段
  @Ignore      //@Ignore 此属性不在数据库生产列
  public String nickname;
  • nickname字段不参与数据库存储。
  • 创建数据访问对象 (DAO)进行增删改查

  • DAO 负责定义访问数据库的方法。
  • 每个 DAO 都包含提供对应用程序数据库的抽象访问的方法。
  • 在编译时,Room 会自动生成您定义的 DAO 的实现。
  • 将 DAO 定义为接口或抽象类。

创建DaoPerson


import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;

import java.util.List;

@Dao
public interface DaoPerson {

    // 新增单个实体
    @Insert
    void insert(Person person);

    // 新增多个实体
    @Insert
    void insertList(List<Person> person);

    // 删除数据
    @Delete
    void delete(Person person);

    @Query("DELETE FROM Person WHERE personId= :personId")
    void delete(String personId);

    // 更新数据
    @Update
    void update(Person person);

    // 查询数据
    // 编写自己的 SQL 查询(query)方法
    @Query("SELECT * FROM Person ORDER BY createTime DESC")
    List<Person> queryAll(); 

    @Query("SELECT * FROM Person WHERE personId = : personId")
    Person queryByPersonId(int personId);
}

创建数据库Room基础类

创建AppBaseDatabase

import androidx.room.Database;
import androidx.room.RoomDatabase;
 
@Database(
        entities = { Person.class,Student.class },
        version = 1,
        exportSchema = false
)
public abstract class AppBaseDatabase extends RoomDatabase {

    public abstract DaoPerson daoPerson();

    public abstract DaoStudent daoStudent(); 
}
  • 该类必须使用 @Database 注释进行注释。该注释包括一个实体数组,该数组列出了与数据库关联的所有数据实体。
  • 该类必须是扩展 RoomDatabase 的抽象类。
  • 对于与数据库关联的每个DAO 类,数据库类必须定义一个具有零参数并返回 DAO 类实例的抽象方法。

创建数据库业务管理类

创建AppDataBaseManager


import android.content.Context;

import androidx.room.Room;

import java.util.List;

public class AppDataBaseManager {

    private String DB_NAME = "myDatabase.db";
    private static AppBaseDatabase database;
    private volatile static AppDataBaseManager INSTANCE = null;

    public static AppDataBaseManager getInstance(Context context) {
        if (INSTANCE == null) {
            INSTANCE = new AppDataBaseManager(context);
        }
        return INSTANCE;
    }

    public AppDataBaseManager(Context context) {
        database = Room.databaseBuilder(context, AppBaseDatabase.class, DB_NAME)
                .allowMainThreadQueries()
                .fallbackToDestructiveMigration()
                .build();
    }

    public <T> void insertList(List<T> list) {
        if (list != null && list.size() > 0) {
            if (list.get(0) instanceof Person) {
                database.daoPerson().insertList((List<Person>) list);
            } else if (list.get(0) instanceof Student) {
                database.daoStudent().insertList((List<Student>) list);
            }
        }
    }

    // 增
    public void insertTask(Object obj) {
        if (obj instanceof Person) {
            database.daoPerson().insert((Person) obj);
        } else if (obj instanceof Student) {
            database.daoStudent().insert((Student) obj);
        }
    }
    // 删
    public void deletePerson(final Person person) {
        database.daoPerson().delete(person);
    }
    // 改
    public void updatePerson(final Person person) {
        database.daoPerson().update(person);
    }
    // 查
    public Person getPersonByPersonId(int personId) {
        return database.daoPerson().queryByPersonId(personId);
    }

}

在Activity类中使用Room

MainActivity

        // 模拟数据插入
        Person person = new Person();
        person.personId = 10086;
        person.realName = "一蓑烟雨任平生";
        AppDataBaseManager.getInstance(this).insertTask(person);
        // 模拟查询
        List<Person> resultList = AppDataBaseManager.getInstance(this).getPersonByPersonId(10086);
  • 这只是一个简单的使用,剩下的业务逻辑看各自项目进行处理了。

Room数据库升级

TODO

相关文章

网友评论

      本文标题:Android-数据库Room框架的简单使用

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