ROOM

介绍

Room 持久层库提供了一个方便我们访问 SQLite 数据库的抽象层(an abstraction layer ),帮助我们更好的在 APP 上创建我们的数据缓存,能够让 APP 即使在没有网络的情况也能正常使用。

架构图

image.png

引用:

    //room
    def room_version = "2.2.1"
    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"

基础操作:

1.定义Entity实例,其对应一个表
@Entity
public class Person {

    @PrimaryKey(autoGenerate = true)
    public int uid;

    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;

    public int age;

}

PrimaryKey为主键,autoGenerate自增选项。
ColumnInfo对应其表字段。
没有则默认参数名为字段名。
Ignore代码忽略。

2.定位DAO文件
@Dao
public interface MyDao {

    @Query("SELECT * from person")
    List<Person> getPersons();

    @Query("SELECT * from person WHERE uid IN (:ids)")
    List<Person> loadAllById(int [] ids);

    @Query("SELECT * from person WHERE first_name like :firstName AND last_name like :lastName ")
    Person findByName(String firstName,String lastName);

    @Insert
    void inert(Person ...persons);

    @Delete
    void delete(Person person);
}

DAO文件需要使用@Dao注解,内部方法增删改查有对应的注解,查询操作注解value内是具体的SQL语句。

3.定义Database文件
@Database(entities = {Person.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract MyDao myDao();
}

Database文件使用@Database注解,参数entities内存放的是对应表所对应的Entity的class,version代表版本号。

4.使用
 final AppDatabase db = Room.databaseBuilder(App.getInstance(),
                AppDatabase.class, "person").build();
 db.myDao().inert(insertPerson);

获取Database 实例,然后调用其内部方法获取到DAO实例,从而操作数据。
具体的实现方法不需要我们操作,因为引用annotationProcessor "androidx.room:room-compiler:$room_version,所以在编译是ROOM内部会自动生成对应的文件,这些文件实现了具体的访问操作。

值得注意的在主线程访问数据库,会报错:

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

因此我们需要在子线程完成访问操作,主线程只接受结果就好。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容