Android Room的用法

时间:2022-06-01 16:31:43

SQLite是Android内置的轻量级关系型数据库,但直接使用SQLite core包做数据库操作有以下劣势:

  • 需要编写长且重复的代码,这会很耗时且容易出错。
  • 管理SQL困难,特别对于复杂的数据库结构。

Room是在这样的背景下应运而生。Room充当现有SQLite API的抽象层。 SQLiite API所有必需的包,参数,方法和变量都使用简单的注释Annotation来表示。相应的Annotation如下:

  • @Entity:数据模型类,对应数据库的表
  • @Dao:使用一个接口类来表示Dao(Data Access Object)
  • @Database:使用此注释的类会创建一个抽象的Dao
  • @PrimaryKey:标识属性为表的主键
  • @Insert:插入到表的数据
  • @Update:更新到表数据
  • @Delete:删除表的数据
  • @Query:执行SQL查询

下面以一个示例讲解下Room的用法。

1、在build.gradle文件中添加gradle依赖关系。

implementation “android.arch.persistence.room:runtime:1.0.0”
annotationProcessor “android.arch.persistence.room:compiler:1.0.0”

2、创建数据库表的数据模型类

@Entity
 public class Movies {
 @NonNull
 @PrimaryKey
 private String movieId;
 private String movieName;

 public Movies() {
 }

 public String getMovieId() { return movieId; }
 public void setMovieId(String movieId) { this.movieId = movieId; }
 public String getMovieName() { return movieName; }
 public void setMovieName (String movieName) { this.movieName = movieName; }
 }

其中@PrimaryKey标记movieId为主键。

3、创建Dao类,并且添加CRUD对应的抽象方法。

@Dao
 public interface DaoAccess {

 @Insert
 void insertOnlySingleMovie (Movies movies);
 @Insert
 void insertMultipleMovies (List<Movies> moviesList);
 @Query (“SELECT * FROM Movies WHERE movieId = :movieId“)
 Movies fetchOneMoviesbyMovieId (int movieId);
 @Update
 void updateMovie (Movies movies);
 @Delete
 void deleteMovie (Movies movies);
 }

@Query自定义了查询的SQL。

4、实现Database类

@Database (entities = {Movies.class}, version = 1, exportSchema = false)
 public abstract class MovieDatabase extends RoomDatabase {
 public abstract DaoAccess daoAccess() ;
 }

此Database类扩展与RoomDatabase,它提供了daoAccess()的抽象方法。

5、在Activity或Fragment类中为Database类声明和初始化对象。

private static final String DATABASE_NAME = “movies_db”;
 private MovieDatabase movieDatabase;
 movieDatabase = Room.databaseBuilder(getApplicationContext(),
 MovieDatabase.class, DATABASE_NAME)
 .fallbackToDesctructiveMigration()
 .build();

初始的步骤完成。 通过使用数据库对象,可以执行数据库管理的所有功能。

插入代码示例:

new Thread(new Runnable() {
 @Override
 public void run() {
 Movies movie =new Movies();
 movie.setMovieId( “2”);
 movie.setMovieName(“芳华”);
 movieDatabase.daoAccess () . insertOnlySingleMovie (movie);
 }
 }) .start();

建议:使用Thread,AsyncTask来执行数据库操作。