Android Room数据库的使用

我们在很多项目中都会使用到数据库SQLite,我之前在项目中都是用的第三方框架GreenDao,知道前几天我才听说有个Google自己弄出来的框架Room,后来我研究了几天,简直吊炸天啊!代码量减少了很多,而且使用起来非常的简单。

首先,什么是Room?为什么要选择Room?

Room是Google官方的数据库框架,在SQLite上提供了一个抽象层,以便在利用SQLite的全部功能的同时能更加流畅的访问数据库。

优点是:

1.大大的减少了代码量,,是大大的!!!

2.层次清晰,上手简单,而且这是谷歌官方提供的,更加安全可靠

下面说一下使用的过程:

1.在app/build.gradle中添加以下依赖

    //room
    implementation 'android.arch.persistence.room:runtime:1.0.0'
    annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'

2.创建实体类,定义Entity

@Entity
public class User {

    @PrimaryKey(autoGenerate = true)//主键是否自动增长,默认为false
    private int id;
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public User() {
    }

    //这里的getter/setter方法是必须的
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

注意,Room主要是利用了注解,我就经常会忘了记注解,所以经常编译不通过.

*实体类开头必须要用@Entity来注解这个类

*开头定义的变量里面至少有一个主键注解@PrimaryKey,并且为true

*必须要有setter跟getter方法

3.创建Dao

@Dao
public interface UserDao {

    //增
    @Insert
    void insert(User... users);

    //删
    @Delete
    void delete(User... users);

    //改
    @Update
    void update(User... users);

    //查
    @Query("SELECT * FROM user")
    List getAllUsers();

}

Dao主要是定义了增删改查的一系列操作,在开头记得注解@Dao

*@Insert,@Delete,@Update,@Query,分别对应了增删改查四种操作

*@Insert,@Delete,@Update,可以传入多种参数,可以以实体类的方式传入,也可以以List的方式传入

*@Query,也可以返回不同的类型,可以返回一个实体类,也可以返回一个List,具体看实际应用

4.创建数据库Database

//                    表名         数据库版本     不添加会警告
@Database(entities = {User.class}, version = 1, exportSchema = false)
public abstract class UserDatabase extends RoomDatabase {

    private static final String DB_NAME = "UserDatabase.db";
    private static volatile UserDatabase instance;

    public static synchronized UserDatabase getInstance(Context context) {
        if (instance == null) {
            instance = create(context);
        }
        return instance;
    }

    private static UserDatabase create(final Context context) {
        return Room.databaseBuilder(
                context,
                UserDatabase.class,
                DB_NAME)
                .allowMainThreadQueries()
                .build();
    }

    public abstract UserDao getUserDao();
    
}

这里要用@Database来注解这个类并且添加了表名,数据库版本

到这里Room大致就搭建完成了,就可以在项目中运用了,

注意:

在Activity中所有对数据库的操作都不可以在主线程中进行,除非在数据库的Builder上调用了allowMainThreadQueries(),或者所有的操作都在子线程中完成,否则程序会崩溃报以下错误:

java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

接下来就可以在Activity中对数据库进行操作了:

增:

    //增
    private void insert(String name,int age) {

        User user = new User();
        user.setName(name);
        user.setAge(age);
        UserDatabase
                .getInstance(this)
                .getUserDao()
                .insert(user);

    }

删:

    //删全部
    private void delAll() {

        UserDatabase
                .getInstance(this)
                .getUserDao()
                .deleteAll();
        tv.setText(null);

    }

改:

    //改
    private void update(String name,int age) {

        User user = 需要修改的那一项数据的实体类;
        user.setName(name);
        user.setAge(age);
        UserDatabase
                .getInstance(this)
                .getUserDao()
                .update(user);

    }

查:

    //查
    private void query() {

        List allUsers = UserDatabase
                .getInstance(this)
                .getUserDao()
                .getAllUsers();

        for (int i = 0; i < allUsers.size(); i++) {
            tv.append(allUsers.get(i).getId() + "\n");
            tv.append(allUsers.get(i).getName() + "\n");
            tv.append(allUsers.get(i).getAge() + "\n");
        }

    }

以上就是Room基本的搭建跟增删改查的操作了,未完待续...

如有不足之处,还请指出

你可能感兴趣的:(Android)