Android Room数据库的使用

咱们在不少项目中都会使用到数据库SQLite,我以前在项目中都是用的第三方框架GreenDao,知道前几天我才据说有个Google本身弄出来的框架Room,后来我研究了几天,简直吊炸天啊!代码量减小了不少,并且使用起来很是的简单。java

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

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

优势是:安全

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

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

下面说一下使用的过程:gradle

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主要是利用了注解,我就常常会忘了记注解,因此常常编译不经过.ui

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

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

*必需要有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<User> 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<User> 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基本的搭建跟增删改查的操做了,未完待续...

若有不足之处,还请指出