欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > Android Room 数据库使用详解

Android Room 数据库使用详解

2024/12/21 22:37:58 来源:https://blog.csdn.net/Billy_Zuo/article/details/144539379  浏览:    关键词:Android Room 数据库使用详解

一、Room介绍

Android Room 是 Google 提供的一个 Android 数据持久化库,是 Android Jetpack 组成部分之一。它提供了一个抽象层,使得 SQLite 数据库的使用更为便捷。通过 Room,开发者可以轻松地操作数据库,不需要直接编写繁琐的 SQL 语句。

Room官方使用示例:https://developer.android.google.cn/codelabs/android-room-with-a-view-kotlin?hl=zh-cn#0

Room 包含三个主要组件

  • 数据库类,用于保存数据库并作为应用持久性数据底层连接的主要访问点。
  • 数据实体类,用于表示应用的数据库中的表。
  • 数据访问对象 (DAO),为您的应用提供在数据库中查询、更新、插入和删除数据的方法。

数据库类为应用提供与该数据库关联的 DAO 的实例。反过来,应用可以使用 DAO 从数据库中检索数据,作为关联的数据实体对象的实例。此外,应用还可以使用定义的数据实体更新相应表中的行,或者创建新行供插入。图 1 说明了 Room 的不同组件之间的关系。

在这里插入图片描述

二、引入Room库

在build.gradle中引入Room库:

    //Room数据库def room_version = "2.5.1"implementation "androidx.room:room-runtime:$room_version"annotationProcessor "androidx.room:room-compiler:$room_version"

三、创建实体类

//实体类 表名 不写默认类名首字母小写
@Entity(tableName = "student")
public class StudentEntity {//主键 自动生成@PrimaryKey(autoGenerate = true)private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

四、创建数据访问对象 (DAO)

@Dao
public interface StudentDao {//插入采集信息@Insertvoid insert(StudentDao studentDao);//删除@Deletevoid delete(StudentDao studentDao);//更新@Updatevoid update(StudentDao studentDao);//查询 名称查询 @Query("select * from student where name =:studentName LIMIT 1")CollectEntity getCollectEntityByFileName(String studentName);//查询 根据age倒序@Query("select * from student order by age desc")List<CollectEntity> getAllCollectList();/*** 查询 根据age倒序,分页查询** @param pageSize  每页的数据量* @param offset 偏移量*/@Query("select * from student order by age desc LIMIT :pageSize OFFSET :offset")List<CollectEntity> getPageCollectList(int pageSize, int offset);
}

五、创建数据库类

@Database(entities = {StudentEntity.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {public static volatile AppDatabase instance;public abstract StudentDao studentDao();public static AppDatabase getInstance() {if (instance == null) {synchronized (AppDatabase.class) {if (instance == null) {instance = Room.databaseBuilder(Utils.getApp().getApplicationContext(),AppDatabase.class, testDb)//是否允许在主线程上操作数据库,默认false。.allowMainThreadQueries().build();}}}return instance;}
}

六、使用数据库

   StudentDao studentDao = AppDatabase.getInstance().studentDao();studentDao.insert(studentEntity);

七、更新数据库

将age的属性由int 更改为 String,version 版本号加1

@Database(entities = {StudentEntity.class}, version = 2)
public abstract class AppDatabase extends RoomDatabase {public static volatile AppDatabase instance;public abstract StudentDao studentDao();public static AppDatabase getInstance() {if (instance == null) {synchronized (AppDatabase.class) {if (instance == null) {instance = Room.databaseBuilder(Utils.getApp().getApplicationContext(),AppDatabase.class, QZConstants.DB.DB_NAME)//是否允许在主线程上操作数据库,默认false。.allowMainThreadQueries().addMigrations(MIGRATION_1_2).build();}}}return instance;}private static final Migration MIGRATION_1_2 = new Migration(1, 2) {@Overridepublic void migrate(@NonNull SupportSQLiteDatabase database) {//创建一个新表,表名为students,age属性为String database.execSQL("CREATE TABLE IF NOT EXISTS students(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT, age TEXT)");//将旧表student表中的数据迁移到新表studentsdatabase.execSQL("insert into students(id, name, age) select id, name, age from student");//删除旧表studentdatabase.execSQL("drop table student");//将新表students名称修改为studentdatabase.execSQL("alter table students rename to student");}};  }

升级数据库:https://blog.51cto.com/u_14152/9288966

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com