一、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 List findByName(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數據庫操作組件,它不僅提高了開發效率,還保證了代碼的可測性和可維護性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/187550.html