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来执行数据库操作。