Android开发之Room(Java)

Android开发之Room(Java)

2023年7月7日发(作者:)

Android开发之Room(Java)Room 在 SQLite 上提供了⼀个抽象层,以便在充分利⽤ SQLite 的强⼤功能的同时,能够流畅地访问数据库。处理⼤量结构化数据的应⽤可极⼤地受益于在本地保留这些数据。最常见的⽤例是缓存相关数据。这样,当设备⽆法访问⽹络时,⽤户仍可在离线状态下浏览相应内容。设备之后重新连接到⽹络后,⽤户发起的所有内容更改都会同步到服务器。官⽅建议使⽤Room,⽽不是SQLite使⽤Room库要在应⽤或模块的⽂件中添加依赖: dependencies { def room_version = "2.2.3" implementation ":room-runtime:$room_version" annotationProcessor ":room-compiler:$room_version" // For Kotlin use kapt instead of annotationProcessor // optional - Kotlin Extensions and Coroutines support for Room implementation ":room-ktx:$room_version" // optional - RxJava support for Room implementation ":room-rxjava2:$room_version" // optional - Guava support for Room, including Optional and ListenableFuture implementation ":room-guava:$room_version" // Test helpers testImplementation ":room-testing:$room_version" }Room包括3个主要组件:数据库:包含数据库持有者,并作为应⽤已保留的持久关系型数据的底层连接的主要接⼊点。Entity:表⽰数据库中的表。DAO:包含⽤于访问数据库的⽅法。它们之间的关系如下使⽤Room实体定义数据使⽤⽰例: @Entity(primaryKeys = {"firstName", "lastName"}) public class User { //@PrimaryKey //public int id;

public String firstName; public String lastName; }定义主键如上有两种⽅式关于字段的访问权限:要保留某个字段,Room 必须拥有该字段的访问权限。您可以将某个字段设为公开字段,也可以为其提供 getter 和setter。如果您使⽤ getter 和 setter ⽅法,则请注意,这些⽅法需遵循 Room 中的 JavaBeans 规范。定义对象之间的关系定义⼀对多关系即使您不能使⽤直接关系,Room 仍允许您定义实体之间的外键约束。例如,如果存在另⼀个名为 Book 的实体,您可以使⽤ @ForeignKey 注释定义该实体与 User 实体的关系,如以下代码段所⽰: @Entity(foreignKeys = @ForeignKey(entity = , parentColumns = "id", childColumns = "user_id")) public class Book { @PrimaryKey public int bookId; public String title; @ColumnInfo(name = "user_id") public int userId; }在 @ForeignKey 注释中添加 onDelete = CASCADE,可以实现级联删除使⽤RoomDAO访问数据,,⽰例: @Dao public interface MyDao { @Insert(onConflict = E) public void users); @Update public void users); @Delete public void users); }查询信息:是 DAO 类中使⽤的主要注释。它允许您对数据库执⾏读/写操作简单查询⽰例: @Dao public interface MyDao { @Query("SELECT * FROM user")//括号内可以是任意其他SQL语句 public User[] loadAllUsers(); }在⽅法返回对象与查询结果字段不匹配时会发出警告可观察查询: 查询⽅法对应的返回指声明为LiveData,例如: @Dao public interface MyDao { @Query("SELECT first_name, last_name FROM user WHERE region IN (:regions)") public LiveData> loadUsersFromRegionsSync(List regions); }这样,应⽤的界⾯就会在数据发⽣变化时⾃动更新了最后⼀步:编写数据库类使⽤ 注释的类应满⾜以下条件:是扩展 RoomDatabase 的抽象类。在注释中添加与数据库关联的实体列表。包含具有 0 个参数且返回使⽤ @Dao 注释的类的抽象⽅法。在运⾏时,您可以通过调⽤ seBuilder() 或 ryDatabaseBuilder() 获取⽰例模板: // Song and Album are classes annotated with @Entity. @Database(version = 1, entities = {, }) abstract class MusicDatabase extends RoomDatabase { // SongDao is a class annotated with @Dao. abstract public SongDao getSongDao(); // AlbumDao is a class annotated with @Dao. abstract public ArtistDao getArtistDao(); // SongAlbumDao is a class annotated with @Dao. abstract public SongAlbumDao getSongAlbumDao(); }在上⾯的例⼦中有两个表(有entities属性声明)和三个DAO(对应三个获取DAO的⽅法)两个获取⽅法:public static Builder databaseBuilder (Context context,Class klass,String name)参数/返回名contextkclassnameBuilder含义数据库的上下⽂。这通常是应⽤程序上下⽂。⽤注释Database和扩展 的抽象类RoomDatabase。数据库⽂件的名称。⼀个RoomDatabaseBuilder实例,⽤于创建数据库public static Builder inMemoryDatabaseBuilder (Context context,Class klass)参数/返回名contextkclassBuilder含义数据库的上下⽂。这通常是应⽤程序上下⽂。⽤注释Database和扩展 的抽象类RoomDatabase。⼀个RoomDatabaseBuilder实例,⽤于创建数据库完成以上步骤,就可以在应⽤中获取database实例来对数据库进⾏操作了实践案例Userpackage om;import Info;import ;import yKey;@Entitypublic class User { @PrimaryKey public int uid; @ColumnInfo(name = "first_name") public String firstName; @ColumnInfo(name = "last_name") public String lastName;}UserDAOpackage om;import ;import ;import ;import ;import ;@Daopublic interface UserDao { @Query("SELECT * FROM user") List getAll(); @Query("SELECT * FROM user WHERE uid IN (:userIds)") List loadAllByIds(int[] userIds); @Query("SELECT * FROM user WHERE first_name LIKE :first AND " + "last_name LIKE :last LIMIT 1") User findByName(String first, String last); @Insert void users); @Delete void delete(User user);}AppDataBasepackage om;import se;import tabase;@Database(entities = {}, version = 1)public abstract class AppDatabase extends RoomDatabase { public abstract UserDao getuserDao();}MainActivitypackage om;import ;import ;import ;import ;import ;import patActivity;import ;import ;public class MainActivity extends AppCompatActivity { UserDao uDAO; AppDatabase db; User u; @Override protected void onCreate(Bundle savedInstanceState) { te(savedInstanceState); setContentView(ty_main); db = seBuilder(getApplicationContext(), , "database-name").build(); ame = new String("Mike"); me = new String("Mathue"); uDAO = rDao(); Log.e("", "onCreate: here"); ((Button)findViewById()).setOnClickListener(new kListener() { @Override public void onClick(View v) { All(u); xt(, "刚刚插⼊信息:firstname:"+ame+"lastname:"+me, _SHORT).show(); } }); ((Button)findViewById()).setOnClickListener(new kListener() { @Override public void onClick(View v) { List allUsers = (); StringBuffer message = new StringBuffer("刚刚插⼊信息:"); for(int i = 0 ; i < () ; i++) { ("firstname-"+i+(i).firstName+"lastname-"+i+(i).lastName); } xt(, message, _SHORT).show(); } }); }}activity_

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信