Google文档:https://developer.android.com/training/data-storage/room/
上例子:在主页面输入用户的ID、姓名、地址点击save按钮保存到数据库,然后在第二个页面输入想查询的用户ID,点击Read按钮显示出来。
效果图:
User (我们的model, Entity)
@Entity(tableName = "user", indices = {@Index("uid")})
public class User {
@PrimaryKey
public int uid;
@ColumnInfo(name = "first_name")
public String firstName;
@ColumnInfo(name = "last_name")
public String lastName;
@ColumnInfo(name = "address")
public String address;
public void setUid(int uid) {
this.uid = uid;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public void setAddress(String address) {
this.address = address;
}
public int getUid() {
return uid;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public String getAddress() {
return address;
}
}
使用Entity时需在build.gradle(app) dependencies中加入(看例子):
dependencies {
implementation 'android.arch.persistence.room:runtime:1.1.1'
annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'
implementation 'android.arch.lifecycle:extensions:1.1.1'
annotationProcessor 'android.arch.lifecycle:compiler:1.1.1'
implementation 'android.arch.persistence.room:rxjava2:1.1.1'
testImplementation 'android.arch.persistence.room:testing:1.1.1'
}
UserDao (访问数据库的方法)
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAll();
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
List<User> loadAllByIds(int[] userIds);
@Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
"last_name LIKE :last LIMIT 1")
User findByName(String first, String last);
@Query("SELECT * FROM user WHERE uid = :userIds LIMIT 1")
User findById(Integer userIds);
@Insert
void insertAll(User... usersList);
@Insert(onConflict = OnConflictStrategy.REPLACE)
long insert(User user);
@Delete
void delete(User user);
}
AppDatabase
@Database(entities = {User.class}, version = 2)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
获取数据库实例:
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name")
.build();
编译时出现报错: java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.(无法访问主线程上的数据库,因为它可能会长时间锁定UI)。
报错原因:Room确保永远不会在主线程上访问Database,因为它可能会锁定主线程并触发ANR(当Android应用程序的UI线程被阻止太长时,会触发“应用程序无响应”(ANR)错误)错误。
如果需要从主线程访问数据库,则应始终使用异步备选或手动将调用移至后台线程。这里我们调用allowMainThreadQueries()来禁用Room的主线程查询检查。
example:
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name")
.allowMainThreadQueries()
.build();
Room database magration 数据库迁移:比如为Entity新增了一列,AppDatabase version 从1升为2。
mAppDatabase = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, DB_NAME)
.addMigrations(MIGRATION_1_2)
.allowMainThreadQueries()
.build();
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE user "
+ " ADD COLUMN address TEXT");
}
};
详细代码请看:https://github.com/JereChen11/RoomDatabase-master
请指教、