导入Jetpack Room框架
要导入 Jetpack Room 框架到您的 Android 项目中,您需要在项目的 Gradle 构建文件中添加相关依赖。以下是导入 Room 框架的基本步骤:
-
打开您的 Android 项目,在 Android Studio 中打开项目目录。
-
打开项目的顶级 (app目录下的那个)
build.gradle
文件,通常是位于项目根目录下的文件。 -
在
dependencies
部分添加 Room 的依赖。通常,您需要添加以下两个依赖项:implementation "androidx.room:room-runtime:2.5.2" // Room的运行时库 annotationProcessor "androidx.room:room-compiler:2.5.2" // Room的编译器
确保将版本号替换为您所需的版本,也可以使用最新版本。
-
现在,同步 Gradle 项目以确保依赖项被正确下载和配置。在 Android Studio 中,您可以点击 “Sync Now” 按钮,或者选择 “File” > “Sync Project with Gradle Files”。
-
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 的基本步骤:
-
添加依赖: 首先,在应用程序的
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 依赖。
-
创建实体类: 定义数据库表的结构,通常通过创建一个实体类来完成。每个实体类代表一个数据库表,每个字段代表表中的列。
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 方法 }
-
创建数据库: 创建一个继承自
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 ] } }
-
创建数据访问对象(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); }
-
初始化数据库: 通常在应用程序的
Application
类中初始化数据库实例。AppDatabase db = Room.databaseBuilder(this,AppDatabase.class, "你数据库的名字").build();
在上面的代码中,您可以指定数据库名称和其他配置选项,如果你想了解更多Room.databaseBuilder 常用方法可以在下文中找到。
-
执行数据库操作: 使用数据访问对象(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