详细介绍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") List getUsersByAge(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();
好了,基本的使用的方式就这些了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。