- 在
build.gradle
中引入依賴
dependencies {
...
implementation "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
...
}
- 創(chuàng)建實(shí)體類
@Entity(tableName = "user")
public class User {
@PrimaryKey
private int uid;
@ColumnInfo(name = "first_name")
private String firstName;
@ColumnInfo(name = "last_name")
private String lastName;
public User() {
}
@Ignore
public User(int uid, String firstName, String lastName) {
this.uid = uid;
this.firstName = firstName;
this.lastName = lastName;
}
// 此處省略了Getter/Settter方法...
}
- 創(chuàng)建Dao接口類,這里只演示了最基本的增刪改查劣针,這個(gè)接口不需要寫實(shí)現(xiàn)類,它的實(shí)現(xiàn)類會(huì)由
android
根據(jù)方法上的注解自動(dòng)生成
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAll();
@Insert
void insertAll(User...users);
@Delete
void delete(User user);
@Update
void update(User user);
@Query("DELETE FROM user")
void deleteAll();
}
- 創(chuàng)建繼承自
RoomDatabase
的抽象類押搪,這個(gè)類時(shí)訪問數(shù)據(jù)庫的關(guān)鍵树酪。在這個(gè)抽象類中用注解配置與數(shù)據(jù)庫中的表相關(guān)聯(lián)的實(shí)體類,并提供返回Dao
對象的抽象方法大州。
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
- 在
build.gradle
中配置數(shù)據(jù)庫的Schema的導(dǎo)出路徑嗅回, 如下配置的導(dǎo)出路徑為app/schemas/
android {
...
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
...
}
...
}
如果不需要導(dǎo)出Schema,可以再第四步中使用如下配置
@Database(entities = {User.class}, version = 1, exportSchema = false)
- 因?yàn)槭窃诮缑嬷惺褂靡粋€(gè)按鈕觸發(fā)測試代碼摧茴,所以寫在了
onClick
方法中
public class MainActivity extends AppCompatActivity {
...
public void onClick(View view) {
// 獲得 AppDatabase 的對象,傳入的第三個(gè)參數(shù)為數(shù)據(jù)庫中表的名字
AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "user").build();
final UserDao userDao = db.userDao();
// 訪問數(shù)據(jù)庫的操作要在子線程中執(zhí)行
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
userDao.deleteAll();
System.out.println("----------- INSERT U1 U2 -------------");
User u1 = new User(1, "a", "b");
User u2 = new User(2, "c", "d");
userDao.insertAll(u1, u2);
List<User> users = userDao.getAll();
System.out.println(users.toString());
System.out.println("------------- DELETE U2 --------------");
userDao.delete(u2);
users = userDao.getAll();
System.out.println(users.toString());
u1.setFirstName("aa");
u1.setLastName("bb");
System.out.println("------------- UPDATE U1 --------------");
userDao.update(u1);
users = userDao.getAll();
System.out.println(users.toString());
}
});
thread.start();
}
...
}
- 測試結(jié)果
I/System.out: ----------- INSERT U1 U2 -------------
I/System.out: [User{uid=1, firstName='a', lastName='b'}, User{uid=2, firstName='c', lastName='d'}]
I/System.out: ------------- DELETE U2 --------------
I/System.out: [User{uid=1, firstName='a', lastName='b'}]
I/System.out: ------------- UPDATE U1 --------------
I/System.out: [User{uid=1, firstName='aa', lastName='bb'}]