一、Jetpack Room是什么
Jetpack Room是Android Jetpack组件中的一员,它是一个SQLite数据库的抽象层,可以帮助Android开发者更容易地使用SQLite。
Jetpack Room与其他ORM(对象关系映射)框架有所不同,它不会想Hibernate或MyBatis一样,将数据表映射到Java POJO类中,而是使用来自Java注解的SQLite查询和表达式,从而减少Java对象与数据库之间的映射关系。
二、使用Jetpack Room的好处
1、类型安全:Jetpack Room使用SQLite语法的同时,又提供了类型安全的查询方式,这可大大减少了在运行时由于拼写错误等问题而导致的错误。
@Query("SELECT * FROM user WHERE age > :minAge") LiveData<List<User>> getUsersOlderThan(int minAge);
2、易于测试:Jetpack Room支持在内存中运行模式,这可以使测试变得异常方便。
@Dao public interface UserDao { @Insert public void insert(User... users); @Query("SELECT * FROM User WHERE name LIKE :name") public ListfindByName(String name); @Query("SELECT * FROM User") public LiveData<List<User>> getAll(); }
3、可观察性:Jetpack Room提供了LiveData和RxJava的支持,这使得数据的变化可以很容易地被观察到。
@Dao public interface UserDao { @Insert public void insert(User user); @Query("SELECT * FROM User WHERE id = :id") public LiveData<User> getUserById(int id); @Query("SELECT * FROM User WHERE name LIKE :name") public LiveData<List<User>> getUsersWithName(String name); }
三、Jetpack Room的主要组成部分
1、Entity:表示数据表中的表格,一个数据表可以包含多个Entity。
@Entity(tableName = "users") public class User { @PrimaryKey public int uid; public String firstName; public String lastName; }
2、DAO(Data Access Object):封装了对Entity的操作,是应用程序与Room交互的主要接口。
@Dao public interface UserDao { @Query("SELECT * FROM user") List<User> getAll(); @Query("SELECT * FROM user WHERE uid = :uid") User getById(int uid); @Insert void insert(User user); @Delete void delete(User user); }
3、Database:表示整个数据库,可以包含多个数据表和多个Entity。
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { private static final String DB_NAME = "myappdatabase.db"; private static AppDatabase instance; public static synchronized AppDatabase getInstance(Context context) { if (instance == null) { instance = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, DB_NAME) .fallbackToDestructiveMigration() .build(); } return instance; } public abstract UserDao userDao(); }
四、Jetpack Room的使用示例
1、添加Jetpack Room到App的依赖中
dependencies { implementation "androidx.room:room-runtime:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version" }
2、定义Entity和DAO
假设我们要创建一个数据表,并将其中一列设置为主键,可以像下面这样写代码:
@Entity(tableName = "users") public class User { @PrimaryKey public int id; public String name; public int age; } @Dao public interface UserDao { @Query("SELECT * FROM users") List<User> getAll(); @Insert void insertAll(User... users); }
3、构建Database
我们使用Room.databaseBuilder()自定义了AppDatabase类并对其进行了初始化:
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); } AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").build();
4、对数据进行操作
使用已经定义好的Dao对数据进行操作:
UserDao userDao = db.userDao(); User user = new User(); user.id = 1; user.name = "Test"; user.age = 25; userDao.insertAll(user); List<User> users = userDao.getAll();
五、结论
Jetpack Room为Android app提供了一种方便易用的SQLite数据库操作组件,它不仅提高了开发效率,还保证了代码的可测性和可维护性。