介绍
Room 持久层库提供了一个方便我们访问 SQLite 数据库的抽象层(an abstraction layer ),帮助我们更好的在 APP 上创建我们的数据缓存,能够让 APP 即使在没有网络的情况也能正常使用。
架构图
引用:
//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.
因此我们需要在子线程完成访问操作,主线程只接受结果就好。