详细介绍Android-Room数据库的使用
前言
Google终于发布了一个和SQLite相关的库了。之前一直都是在SQLite、XUtils、greenDao、Realm这些数据库之间来回折腾。现在终于有一个更“正统”数据库了。
Room是什么?
Room是一个持久性数据库。
Room持久性库提供了SQLite的抽象层,以便在充分利用SQLite的同时允许流畅的数据库访问。
为什么会选择Room?
前面我也说到了现在也有不少开源的数据库给大家使用,那为什么我们还要去学习使用这个库呢?当然不是我前面说的“正不正统”的原因了。
因为Room有下面几个优点:
①SQL查询在编译时就会验证-在编译时检查每个@Query和@Entity等,这就意味着没有任何运行时错误的风险可能会导致应用程序崩溃(并且它不仅检查语法问题,还会检查是否有该表)
②较少的模板代码
③与LiveData集成
该如何使用它?
1、在app/build.gradle中添加以下依赖
implementation'android.arch.persistence.room:runtime:1.0.0' annotationProcessor'android.arch.persistence.room:compiler:1.0.0'
你可以点击这里查看最新依赖版本号
2、创建JavaBean
@Entity
publicclassUser{
@PrimaryKey(autoGenerate=true)//主键是否自动增长,默认为false
privateintid;
privateStringname;
privateintage;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
//这里的getter/setter方法是必须的
//这里的getter/setter方法是必须的
//这里的getter/setter方法是必须的
//重要的事说三遍
}
这里需要使用@Entity来注解该类
至少要有一个主键@PrimaryKey
3、创建Dao
接下来,需要为我们的实体创建DAO。DAO代表数据访问对象,所以它是告诉我们的数据库如何操作数据的一种方式:
@Dao
publicinterfaceUserDao{
@Query("SELECT*FROMuser")
ListgetAllUsers();
@Insert
voidinsert(User...users);
@Update
voidupdate(User...users);
@Delete
voiddelete(User...users);
}
使用@Dao注解该接口
@Insert,@Update,@Delete,@Query代表我们常用的插入、更新、删除、查询数据库操作
@Insert,@Update,@Delete可以传入多种不同的参数。例如:
@Insert voidinsert(User...users); @Insert voidinsert(Useruser); @Insert voidinsert(ListuserLists);
同理,@Query也可以返回多种不同的类型。
@Query("SELECT*FROMuser")
ListgetAllUsers();
@Query("SELECT*FROMuserWHEREid=:id")
UsergetUser(intid);
@Query("SELECT*FROMuser")
CursorgetUserCursor();
当然,除了这些我们还可以传入一些限制符进去。例如,
@Query("SELECT*FROMuserWHEREage=:age")
ListgetUsersByAge(intage);
@Query("SELECT*FROMuserWHEREage=:ageLIMIT:max")
ListgetUsersByAge(intmax,int...age);
4、创建数据库
@Database(entities={User.class},version=1,exportSchema=false)
publicabstractclassUserDatabaseextendsRoomDatabase{
privatestaticfinalStringDB_NAME="UserDatabase.db";
privatestaticvolatileUserDatabaseinstance;
staticsynchronizedUserDatabasegetInstance(Contextcontext){
if(instance==null){
instance=create(context);
}
returninstance;
}
privatestaticUserDatabasecreate(finalContextcontext){
returnRoom.databaseBuilder(
context,
UserDatabase.class,
DB_NAME).build();
}
publicabstractUserDaogetUserDao();
}
这里使用@Database注解该类并添加了表名、数据库版本(每当我们改变数据库中的内容时它都会增加),所以这里使用exportSchema=false
注意:除了添加表映射的类以及和数据库版本外,还要添加exportSchema=false否则会报警告。
Error:(10,17)警告:Schemaexportdirectoryisnotprovidedtotheannotationprocessorsowecannotexporttheschema.Youcaneitherprovideroom.schemaLocationannotationprocessorargumentORsetexportSchematofalse.
我们抽象了getUserDao()方法,这是必要的。
5、使用数据库
我们终于能够操作我们的数据库了。但是所有的操作必须在后台线程中完成。你可以通过使用AsyncTask,Thread,Handler,RxJava或其它方式来完成。
如果没有在后台线程执行,并且也没有说明可以在主线程操作的话,就会报以下错误。
Causedby:java.lang.IllegalStateException:CannotaccessdatabaseonthemainthreadsinceitmaypotentiallylocktheUIforalongperiodoftime.
例如,我们可以像下面这样插入数据
Useruser=newUser();
user.setName("name1");
user.setAge(18);
UserDatabase
.getInstance(context)
.getUserDao()
.insert(user);
或者这样
ListallUsers=UserDatabase .getInstance(RoomActivity.this) .getUserDao() .getAllUsers();
好了,基本的使用的方式就这些了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。