我们在很多项目中都会使用到数据库SQLite,我之前在项目中都是用的第三方框架GreenDao,知道前几天我才听说有个Google自己弄出来的框架Room,后来我研究了几天,简直吊炸天啊!代码量减少了很多,而且使用起来非常的简单。
首先,什么是Room?为什么要选择Room?
Room是Google官方的数据库框架,在SQLite上提供了一个抽象层,以便在利用SQLite的全部功能的同时能更加流畅的访问数据库。
优点是:
1.大大的减少了代码量,,是大大的!!!
2.层次清晰,上手简单,而且这是谷歌官方提供的,更加安全可靠
下面说一下使用的过程:
//room
implementation 'android.arch.persistence.room:runtime:1.0.0'
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'
@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方法
@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,具体看实际应用
// 表名 数据库版本 不添加会警告
@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基本的搭建跟增删改查的操作了,未完待续...
如有不足之处,还请指出