引言:
Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。直接用SQLite的童鞋们可以迁移到Room使用方便很多。
实现:
-
配置
在build.gradle中添加如下配置
def room_version = 2.3.0
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
implementation "androidx.room:room-rxjava2:$room_version"
- Room由三个重要的组件组成:Database、Entity、DAO。
-
Database 是数据库的持有者,是应用持久关联数据的底层连接的主要访问点。Database的类编写时必须满足下面几个条件:
-
必须是abstract类而且的extends RoomDatabase。
-
必须在类头的注释中包含与数据库关联的实体列表(Entity对应的类)。
-
包含一个具有0个参数的抽象方法,并返回用@Dao注解的类
-
@Database(entities = {User.class}, version = 1)
public abstract class MyDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
- Entity 代表数据库中某个表的实体类。
@Entity(tableName = "user")
data class User(
@PrimaryKey(autoGenerate = true) var userId: Long,
@ColumnInfo(name = "name")var userName: String,
@Ignore var sex: Boolean
)
- DAO封装用于访问数据库的方法。 @Query
@Query("select * from user where userId = :id")
fun getUserById(id: Long): User
@Insert
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun addUser(user: User)
@Delete
@Delete
fun deleteUserByUser(user: User)
@Update
@Update
fun updateUserByUser(user: User)
全文搜索
之前APP项目也是用的room但因为是全网情况下使用所以使用本地搜索情况比较少一般用like就可以,但是现在平板项目要求在离线情况下可以正常使用所以在搜索功能做了增强使用全文搜索。 要使用 Room 2.1.0 及更高版本中提供的这项功能,请将 @Fts3 或 @Fts4 注释添加到给定实体,如以下代码段所示:
@Fts4
@Entity(tableName = "user")
public class User {
@PrimaryKey
@ColumnInfo(name = "rowid")
public int id;
@ColumnInfo(name = "first_name")
public String firstName;
}
注意:启用 FTS 的表始终使用 INTEGER 类型的主键且列名称为“rowid”。如果是由 FTS 表支持的实体定义主键,则必须使用相应的类型和列名称。
注意点:
- 因为每次创建Database实例都会产生比较大的开销,所以应该将Database设计成单例的,或者直接放在Application中创建。
- allowMainThreadQueries()用于允许主线程查询。不过这个属性最好是通过实现与RxJava结合使用后去掉,防止在主线程里面查询出现死锁。
- 表字段进行修改后,要进行数据库库版本升级。
- 全文搜索要做好副表的构造,以后还要做到多国语言