Jetpack Room来便捷的工程化操作数据库基础知识

导入Jetpack Room框架

要导入 Jetpack Room 框架到您的 Android 项目中,您需要在项目的 Gradle 构建文件中添加相关依赖。以下是导入 Room 框架的基本步骤:

  1. 打开您的 Android 项目,在 Android Studio 中打开项目目录。

  2. 打开项目的顶级 (app目录下的那个)build.gradle 文件,通常是位于项目根目录下的文件。

  3. dependencies 部分添加 Room 的依赖。通常,您需要添加以下两个依赖项:

    implementation "androidx.room:room-runtime:2.5.2" // Room的运行时库
    annotationProcessor "androidx.room:room-compiler:2.5.2" // Room的编译器
    

    确保将版本号替换为您所需的版本,也可以使用最新版本。

  4. 现在,同步 Gradle 项目以确保依赖项被正确下载和配置。在 Android Studio 中,您可以点击 “Sync Now” 按钮,或者选择 “File” > “Sync Project with Gradle Files”。

  5. Room 框架现在已成功导入到您的 Android 项目中,您可以开始使用 Room 来管理数据库。

如果遇到问题:Your project may be using a version of the Android Gradle plug-in that does not contain the method (e.g. ‘testCompile’ was added in 1.1.0).可能是由于你写错了地方

尝试解决方案:
1.把编辑器的文件栏从Android切换成Project
2.在build.gradle中的dependencies添加 Room 的依赖

使用Jetpack Room

Jetpack Room 是 Android 开发中的一个持久性库,用于简化 SQLite 数据库的管理和访问。下面是使用 Jetpack Room 的基本步骤:

  1. 添加依赖: 首先,在应用程序的 build.gradle 文件中添加 Room 的依赖:

    implementation "androidx.room:room-runtime:2.5.2"
    annotationProcessor "androidx.room:room-compiler:2.5.2"
    androidTestImplementation 'org.projectlombok:lombok:1.18.28' //这是实现getting和setting的插件工具,可自由选择是否安装
        
    //或者选择
    implementation libs.androidx.room.runtime
    annotationProcessor libs.androidx.room.compiler
    androidTestImplementation libs.lombok
    

    确保使用最新版本的 Room 依赖。

  2. 创建实体类: 定义数据库表的结构,通常通过创建一个实体类来完成。每个实体类代表一个数据库表,每个字段代表表中的列。

    import androidx.room.Entity;
    import androidx.room.PrimaryKey;
    import lombok.Data;
    
    @Entity(tableName = "user")
    @Data  //这是自动实现getting和setting的插件工具,安装了就可以使用,要不然就alt+ins键生成吧
    public class User {
        @PrimaryKey(autoGenerate = true)
        private int id;
    
        @ColumnInfo(name = "name")
        private String name;
    
        @ColumnInfo(name = "email")
        private String email;
    
        // 构造函数、getter 和 setter 方法
    }
    
  3. 创建数据库: 创建一个继承自 RoomDatabase 的抽象类,其中包含应用程序的数据库和数据访问对象(DAO)的抽象方法。

    // exportSchema 是一个布尔值,它控制是否将数据库的模式导出到一个文件。 如果设置为 true,则数据库的模式将导出到一个名为 schema.sql 的文件中。这个文件可以用来创建数据库的副本, 或者用来在另一个数据库中创建相同的表。 
    
    @Database(entities = {User.class}, version = 1, exportSchema = true)
    public abstract class AppDatabase extends RoomDatabase {
        public abstract UserDao userDao();
    }
    

    关于exportSchema为true时的附加配置

    // 配置在app目录下的build.gradle文件,找到android.defaultConfig配置
    javaCompileOptions {
        annotationProcessorOptions {
            arguments = [
                "room.schemaLocation": "$projectDir/schemas".toString(),// 指定导出位置
                "room.incremental": "true",// 增量编译
                "room.expandProjection": "true"// 支持room的projection
            ]
        }
    }
    
  4. 创建数据访问对象(DAO): 创建一个接口或抽象类,定义与数据库交互的操作方法。这些方法使用注解来指定 SQL 查询或操作。

    @Dao
    public interface UserDao {
        @Insert
        void insert(User ...user); //...为可接收多参数
    
        @Query("SELECT * FROM user WHERE id = :userId")
        User getUserById(int userId);
    
        @Update
        void updateUser(User user);
    
        @Delete
        void deleteUser(User user);
    }
    
  5. 初始化数据库: 通常在应用程序的 Application 类中初始化数据库实例。

    AppDatabase db = Room.databaseBuilder(this,AppDatabase.class, "你数据库的名字").build();
    

    在上面的代码中,您可以指定数据库名称和其他配置选项,如果你想了解更多Room.databaseBuilder 常用方法可以在下文中找到。

  6. 执行数据库操作: 使用数据访问对象(DAO)的方法来执行数据库操作。例如,插入、查询、更新或删除数据。

    // 创建新的用户
    User user = new User();
    user.setName("BaoBao");
    user.setEmail("laobaby@love.com");
    userDao.insert(user);
    
    // 获取id为1的用户
    User retrievedUser = userDao.getUserById(1);
    // 设置用户邮箱
    retrievedUser.setEmail("sir@wifiming.com");
    userDao.updateUser(retrievedUser);
    

这是 Room 的基本用法。Room 还提供了更高级的功能,如支持 RxJava、LiveData、数据库迁移等。您可以根据应用程序的需求来使用这些功能。

请注意,Room 大大简化了数据库的管理,允许您使用强类型的 Java 或 Kotlin 对象来代替手动编写 SQL 查询。这使得数据库操作更安全、更易维护。在使用 Room 时,请确保仔细查看官方文档,以便充分利用其功能。

Jetpack Room 常用注解

  • @Database:用于指定数据库的名称、版本和表。
  • @Entity:用于指定实体类。
  • @PrimaryKey:用于指定主键。
  • @ColumnInfo:用于指定列的信息。
  • @Embedded:用于嵌入其他实体。
  • @Dao:用于指定数据访问对象。
  • @Insert:用于插入数据。
  • @Update:用于更新数据。
  • @Delete:用于删除数据。
  • @Query:用于查询数据。

以下是每个注解的详细说明:

@Database

用于指定数据库的名称、版本和表。

@Database(entities = {User.class, Post.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {

    public abstract UserDao userDao();

    public abstract PostDao postDao();

}

@Entity

用于指定实体类。

@Entity(tableName = "users")
public class User {

    @PrimaryKey(autoGenerate = true)
    private int id;

    private String name;

    private int age;

}

@PrimaryKey

用于指定主键。

@PrimaryKey(autoGenerate = true)
private int id;

@ColumnInfo

用于指定列的信息。

@ColumnInfo(name = "name")
private String name;

@ColumnInfo(name = "age")
private int age;

@Embedded

用于嵌入其他实体。

@Entity(tableName = "posts")
public class Post {

    @PrimaryKey(autoGenerate = true)
    private int id;

    private String title;

    @Embedded
    private User author;

}

@Dao

用于指定数据访问对象。

@Dao
public interface UserDao {

    @Insert
    void insert(User user);

    @Query("SELECT * FROM users")
    List<User> getAllUsers();

}

@Insert

用于插入数据。

@Insert
    void insert(User user);

@Update

用于更新数据。

@Update
    void update(User user);

@Delete

用于删除数据。

@Delete
    void delete(User user);

@Query

用于查询数据。

@Query("SELECT * FROM users WHERE id = :id")
User getUserById(int id);

Jetpack Room 还提供了一些其他注解,用于指定数据库的其他属性,例如:

  • @TypeConverters:用于指定数据类型转换器。
  • @Transaction:用于指定事务。
  • @Ignore:用于忽略某些字段或属性。

Room.databaseBuilder 常用方法

  • Room.databaseBuilder 有以下常用方法:

    • setJournalMode(JournalMode mode):设置日志模式。
    • setQueryExecutor(Executor executor):设置查询执行器。
    • setTransactionExecutor(Executor executor):设置事务执行器。
    • addMigrations(Migration… migrations):添加数据库迁移。
    • allowMainThreadQueries():允许在主线程执行查询。
    • fallbackToDestructiveMigration():在数据库版本不兼容时进行破坏性迁移。
    • build():构建数据库。

    以下是每个方法的详细说明:

    setJournalMode(JournalMode mode)

    设置日志模式。日志模式用于控制 Room 如何记录数据库操作。默认日志模式为 TRUNCATE,即在数据库版本升级时会删除旧数据。

    Room.databaseBuilder(context, AppDatabase.class, "app_database")
        .setJournalMode(JournalMode.TRUNCATE)
        .build();
    

    setQueryExecutor(Executor executor)

    设置查询执行器。查询执行器用于执行数据库查询。默认查询执行器为 AsyncTaskExecutor,即在后台线程执行查询。

    Room.databaseBuilder(context, AppDatabase.class, "app_database")
        .setQueryExecutor(Executors.newSingleThreadExecutor())
        .build();
    

    setTransactionExecutor(Executor executor)

    设置事务执行器。事务执行器用于执行数据库事务。默认事务执行器为 AsyncTaskExecutor,即在后台线程执行事务。

    Room.databaseBuilder(context, AppDatabase.class, "app_database")
        .setTransactionExecutor(Executors.newSingleThreadExecutor())
        .build();
    

    addMigrations(Migration… migrations)

    添加数据库迁移。数据库迁移用于在数据库版本升级时将旧数据转换为新数据。

    class Migration1To2 : Migration(1, 2) {
    
        override fun migrate(database: SupportSQLiteDatabase) {
            // 将旧数据转换为新数据
        }
    
    }
    
    Room.databaseBuilder(context, AppDatabase.class, "app_database")
        .addMigrations(Migration1To2())
        .build();
    

    allowMainThreadQueries()

    允许在主线程执行查询。默认情况下,Room 不允许在主线程执行查询,因为这可能会导致应用程序卡顿。

    Room.databaseBuilder(context, AppDatabase.class, "app_database")
        .allowMainThreadQueries()
        .build();
    

    fallbackToDestructiveMigration()

    在数据库版本不兼容时进行破坏性迁移。破坏性迁移会删除旧数据,并将数据库表重建为新版本。

    Room.databaseBuilder(context, AppDatabase.class, "app_database")
        .fallbackToDestructiveMigration()
        .build();
    

    build()

    构建数据库。

    Room.databaseBuilder(context, AppDatabase.class, "app_database")
        .build();
    

更多信息,请参考 Jetpack Room 文档:https://developer.android.com/training/data-storage/room

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于 Room 数据库的升级,您需要遵循以下步骤: 1. 在新版本的数据库中定义新表结构或对旧表结构进行更改,例如添加、删除或修改表的列。 2. 在您的 `AppDatabase` 类中增加数据库版本号,可以在类上使用 `@Database` 注解指定版本号,例如: ```kotlin @Database(entities = [User::class], version = 2) abstract class AppDatabase : RoomDatabase() { //... } ``` 3. 创建一个实现 `Migration` 接口的类,该类将包含从旧版本升级到新版本所需的所有更改。例如: ```kotlin val migration_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("ALTER TABLE users ADD COLUMN age INTEGER NOT NULL DEFAULT 0") } } ``` 该示例代码表示,从版本 1 升级到版本 2,需要在 `users` 表中添加一个名为 `age` 的整数类型的列。 4. 在 `AppDatabase` 类中,使用 `addMigrations()` 方法将 `Migration` 对象添加到数据库中,例如: ```kotlin @Database(entities = [User::class], version = 2) abstract class AppDatabase : RoomDatabase() { //... companion object { val migration_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("ALTER TABLE users ADD COLUMN age INTEGER NOT NULL DEFAULT 0") } } } //... init { if (BuildConfig.DEBUG) { // 在调试模式下,如果发现数据结构变化,将会清空数据 fallbackToDestructiveMigration() } else { // 在正式发布模式下,如果发现数据结构变化,将会执行升级脚本 addMigrations(migration_1_2) } } } ``` 在上述示例代码中,我们将 `migration_1_2` 对象添加到 `AppDatabase` 类的伴生对象中,并在 `init` 块中进行了初始化。我们还使用了 `fallbackToDestructiveMigration()` 方法,如果在调试模式下发现数据结构变化,将会清空数据。在正式发布模式下,我们使用了 `addMigrations()` 方法,将 `migration_1_2` 对象添加到数据库中,以执行升级脚本。 这样,在您的应用程序使用新版本的数据库时,将自动执行升级脚本,以将旧数据结构转换为新数据结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WiFiMing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值