Android-Room数据库-多表查询(Relationships)
Android-Room自定义类型(TypeConverter)
Android—Room 数据库迁移(Migration)
Android — Room 数据库跳跃式升级(Migration)
前言
Google终于发布了一个和SQLite相关的库了😭😭😭。之前一直都是在SQLite、XUtils、greenDao、Realm这些数据库之间来回折腾。现在终于有一个更“正统”数据库了。
Room是什么?
Room是一个持久性数据库。
Room持久性库提供了SQLite的抽象层,以便在充分利用SQLite的同时允许流畅的数据库访问。
为什么会选择Room?
前面我也说到了现在也有不少开源的数据库给大家使用,那为什么我们还要去学习使用这个库呢?当然不是我前面说的“正不正统”的原因了。
因为Room有下面几个优点:
① SQL查询在编译时就会验证 - 在编译时检查每个@Query和@Entity等,这就意味着没有任何运行时错误的风险可能会导致应用程序崩溃(并且它不仅检查语法问题,还会检查是否有该表)
② 较少的模板代码
③ 与 LiveData集成
该如何使用它?
1、在app/build.gradle中添加以下依赖
implementation 'android.arch.persistence.room:runtime:1.0.0'
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'
你可以点击这里查看最新依赖版本号
2、创建JavaBean
@Entity
public class User {
@PrimaryKey(autoGenerate = true)//主键是否自动增长,默认为false
private int id;
private String name;
private int age;
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;
}
//这里的getter/setter方法是必须的
//这里的getter/setter方法是必须的
//这里的getter/setter方法是必须的
//重要的事说三遍
}
- 这里需要使用
@Entity来注解该类 - 至少要有一个主键
@PrimaryKey
3、创建Dao
接下来,需要为我们的实体创建DAO。 DAO代表数据访问对象,所以它是告诉我们的数据库如何操作数据的一种方式:
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAllUsers();
@Insert
void insert(User... users);
@Update
void update(User... users);
@Delete
void delete(User... users);
}
- 使用
@Dao注解该接口 -
@Insert,@Update,@Delete,@Query代表我们常用的插入、更新、删除、查询数据库操作
@Insert, @Update, @Delete可以传入多种不同的参数。例如:
@Insert
void insert(User... users);
@Insert
void insert(User user);
@Insert
void insert(List<User> userLists);
同理,@Query也可以返回多种不同的类型。
@Query("SELECT * FROM user")
List<User> getAllUsers();
@Query("SELECT * FROM user WHERE id=:id")
User getUser(int id);
@Query("SELECT * FROM user")
Cursor getUserCursor();
当然,除了这些我们还可以传入一些限制符进去。例如,
@Query("SELECT * FROM user WHERE age=:age")
List<User> getUsersByAge(int age);
@Query("SELECT * FROM user WHERE age=:age LIMIT :max")
List<User> getUsersByAge(int max, int... age);
4、创建数据库
@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;
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).build();
}
public abstract UserDao getUserDao();
}
这里使用@Database注解该类并添加了表名、数据库版本(每当我们改变数据库中的内容时它都会增加),所以这里使用exportSchema = false
注意:除了添加表映射的类以及和数据库版本外,还要添加
exportSchema = false否则会报警告。
Error:(10, 17) 警告: Schema export directory is not provided to the annotation processor so we cannot export the schema. You can either provideroom.schemaLocationannotation processor argument OR set exportSchema to false.
我们抽象了getUserDao()方法,这是必要的。
5、使用数据库
我们终于能够操作我们的数据库了。但是所有的操作必须在后台线程中完成。你可以通过使用AsyncTask,Thread,Handler,RxJava或其它方式来完成。
如果没有在后台线程执行,并且也没有说明可以在主线程操作的话,就会报以下错误。
Caused by: java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
例如,我们可以像下面这样插入数据
User user=new User();
user.setName("name1");
user.setAge(18);
UserDatabase
.getInstance(context)
.getUserDao()
.insert(user);
或者这样
List<User> allUsers = UserDatabase
.getInstance(RoomActivity.this)
.getUserDao()
.getAllUsers();
好了,基本的使用的方式就这些了。未完待续










网友评论