引用:
implementation "androidx.room:room-runtime:2.0.0-beta01"
annotationProcessor "androidx.room:room-compiler:2.0.0-beta01"
一.定義表(@Entity)
定義一張PersonBean表
1.每張表必須有至少一個(gè)字段使用@PrimaryKey標(biāo)識(shí)(autoGenerate=true 自增長(zhǎng))
2.表中每一列使用@ColumnInfo標(biāo)識(shí),并且推薦顯示使用name參數(shù)定義好表的列名
3.如果你的列名使用private修復(fù),那么必須提供set get方法
4.@Ignore,表示一個(gè)屬性不加入生成表的字段,只是臨時(shí)使用
@Entity
public class PersonBean {
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo(name = "version")
private String version;
@ColumnInfo(name = "name")
private String name;
@ColumnInfo(name = "myadress")
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "MyRoomTable{" +
"id=" + id +
", version='" + version + '\'' +
", name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
二.定義數(shù)據(jù)庫(kù)訪問(wèn)對(duì)象(@Dao)
全部通過(guò)注解定義,Query方法需要指定sql語(yǔ)句
@Dao
public interface PersonInfoDao {
@Insert
void insert(PersonBean personBean);
@Delete
void delete(PersonBean personBean);
@Update
void update(PersonBean personBean);
@Query(value = "select * from PersonBean where name like :name")
PersonBean findByName(String name);
@Query(value = "select * from PersonBean")
List<PersonBean> findAll();
}
三.定義數(shù)據(jù)庫(kù)
定義一個(gè)抽象類繼承RoomDatabase,提供dao獲取接口
1.entities指定包含的數(shù)據(jù)表
2.version指定表的版本,和版本升級(jí)有關(guān)
@Database(entities = {PersonBean.class, version = 1, exportSchema = false)
public abstract class PersonInfoDb extends RoomDatabase {
public abstract PersonInfoDao getPersonDao();
}
四.Build一下后通過(guò)apt生成輔助類
五.使用
PersonInfoDb personInfoDb = Room.databaseBuilder(getApplicationContext(), PersonInfoDb.class, "renzhenming").build();
PersonInfoDao personDao = personInfoDb.getPersonDao();
for (int i = 0; i < 100; i++) {
PersonBean p = new PersonBean();
p.setAddress("上海陸家嘴" + i + "號(hào)");
p.setName("張三" + i);
p.setVersion("" + i);
personDao.insert(p);
}
List<PersonBean> p = personDao.findAll();
System.out.println("renzhenming: " + p);
六.定義一個(gè)表作為另一個(gè)表的外鍵
指定teacher中teacher_id為PersonBean id的外鍵,onDelete = CASCADE,onUpdate = CASCADE標(biāo)識(shí)當(dāng)PersonBean刪除后者更新后,Teacher中對(duì)應(yīng)id的數(shù)據(jù)也同步進(jìn)行刪除和更新
@Entity
public class PersonBean {
@PrimaryKey(autoGenerate = true)
private int id;
}
Entity(foreignKeys = @ForeignKey(entity = PersonBean.class,parentColumns = "id",
childColumns = "teacher_id",onDelete = CASCADE,onUpdate = CASCADE))
public class Teacher {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "teacher_id")
}
七.嵌套類
Teacher中嵌套了Father,通過(guò)prefix = "father"指定Father表中列的前綴,防止重復(fù)
@Entity
public class Teacher {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "teacher_id")
private int id;
@ColumnInfo(name = "teacher_name")
private String name;
@ColumnInfo(name = "teacher_age")
private int age;
@Embedded(prefix = "father")
private Father father;
}
@Entity
public class Father {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
private int id;
@ColumnInfo(name = "name")
private String name;
@ColumnInfo(name = "age")
private int age;
}
八.數(shù)據(jù)庫(kù)升級(jí)addMigrations(Migration)
MyDatabase instance = Room.databaseBuilder(context.getApplicationContext(), MyDatabase.class, "renzm_upgrade")
//可以強(qiáng)制在主線程運(yùn)行數(shù)據(jù)庫(kù)操作
.allowMainThreadQueries()
//強(qiáng)制升級(jí)
//.fallbackToDestructiveMigration()
.addMigrations(MIGRATION_1_2)
.build();
//進(jìn)行數(shù)據(jù)庫(kù)升級(jí) version 1 to version 2
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
//在這里用sql腳本完成數(shù)據(jù)變化
database.execSQL("alter table myteacher add column flag integer not null default 1");
}
};
支持Rxjava
@Dao
public interface MyDao {
@Query("SELECT * from user where id = :id LIMIT 1")
public Flowable<User> loadUserById(int id);
}