赞
踩
在Android开发中,Room是Google提供的一个持久化库,旨在为应用提供SQLite的抽象层,以简化数据库的访问和操作。相比直接使用SQLite,Room提供更清晰、更简洁的数据库访问机制。
首先,在你的项目的build.gradle
(Module: app) 文件中添加Room的依赖:
dependencies {
def room_version = "2.4.3"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
// 可选 - RxJava支持
implementation "androidx.room:room-rxjava3:$room_version"
// 可选 - Guava支持 (使用ImmutableList等)
implementation "androidx.room:room-guava:$room_version"
// Test helpers
testImplementation "androidx.room:room-testing:$room_version"
}
确保替换room_version
为最新的版本。
在Room中,每个数据库表由一个实体类表示。以下是一个示例实体类:
@Entity(tableName = "users")
public class User {
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo(name = "first_name")
private String firstName;
@ColumnInfo(name = "last_name")
private String lastName;
// 构造函数、getter和setter省略
}
DAO是一个接口,定义了访问数据库的各种方法。Room将DAO的声明转换为实际的数据库代码。
@Dao
public interface UserDao {
@Insert
void insert(User user);
@Query("SELECT * FROM users")
List<User> getAllUsers();
@Delete
void delete(User user);
@Update
void update(User user);
}
Room数据库类是访问数据库的主要入口点。使用@Database
注释来标记它,并列出所有的实体和版本号。
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
通常你会使用单例模式来创建和管理数据库实例,避免频繁开销大的资源消耗。
public class DatabaseClient { private Context mCtx; private static DatabaseClient mInstance; // 我们的app数据库对象 private AppDatabase appDatabase; private DatabaseClient(Context mCtx) { this.mCtx = mCtx; //创建数据库appdatabase appDatabase = Room.databaseBuilder(mCtx, AppDatabase.class, "MyToDos").build(); } public static synchronized DatabaseClient getInstance(Context mCtx) { if (mInstance == null) { mInstance = new DatabaseClient(mCtx); } return mInstance; } public AppDatabase getAppDatabase() { return appDatabase; } }
使用DAO执行数据库操作。所有的数据库操作默认不在主线程执行。
// 插入
DatabaseClient.getInstance(getApplicationContext()).getAppDatabase()
.userDao()
.insert(new User(0, "John", "Doe"));
// 获取用户
List<User> users = DatabaseClient.getInstance(getApplicationContext()).getAppDatabase()
.userDao()
.getAllUsers();
Room支持返回LiveData
或Flowable
对象,使得数据库的响应可以观察并自动更新UI。
@Query("SELECT * FROM users")
LiveData<List<User>> getLiveUsers();
随着应用的发展,您可能需要修改数据库架构。Room可以通过数据库迁移脚本来处理架构变化:
Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name")
.addMigrations(MIGRATION_1_2, MIGRATION_2_3)
.build();
如果你需要存储自定义数据类型,那么Type Converters是必需的。
public class Converters {
@TypeConverter
public static Date fromTimestamp(Long value) {
return value == null ? null : new Date(value);
}
@TypeConverter
public static Long dateToTimestamp(Date date) {
return date == null ? null : date.getTime();
}
}
将Converter类添加到数据库定义中:
@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
Room提供了便捷的工具来帮助开发者编写数据库操作的单元测试。
Room库为Android数据库操作提供了一种结构化而现代的方式,极大简化了数据库开发工作。此外,整合RxJava、LiveData等组件可以使得Room的使用更加高效和符合现代Android开发的需求。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。