引用:
implementation "androidx.room:room-runtime:2.0.0-beta01"
annotationProcessor "androidx.room:room-compiler:2.0.0-beta01"
一.定義表(@Entity)
定義一張PersonBean表
1.每張表必須有至少一個字段使用@PrimaryKey標識(autoGenerate=true 自增長)
2.表中每一列使用@ColumnInfo標識,並且推薦顯示使用name參數定義好表的列名
3.如果你的列名使用private修復,那麼必須提供set get方法
4.@Ignore,表示一個屬性不加入生成表的字段,只是臨時使用
@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 + '\'' +
'}';
}
}
二.定義數據庫訪問對象(@Dao)
全部通過註解定義,Query方法需要指定sql語句
@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();
}
三.定義數據庫
定義一個抽象類繼承RoomDatabase,提供dao獲取接口
1.entities指定包含的數據表
2.version指定表的版本,和版本升級有關
@Database(entities = {PersonBean.class, version = 1, exportSchema = false)
public abstract class PersonInfoDb extends RoomDatabase {
public abstract PersonInfoDao getPersonDao();
}
四.Build一下後通過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 + "號");
p.setName("張三" + i);
p.setVersion("" + i);
personDao.insert(p);
}
List<PersonBean> p = personDao.findAll();
System.out.println("renzhenming: " + p);
六.定義一個表作爲另一個表的外鍵
指定teacher中teacher_id爲PersonBean id的外鍵,onDelete = CASCADE,onUpdate = CASCADE標識當PersonBean刪除後者更新後,Teacher中對應id的數據也同步進行刪除和更新
@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,通過prefix = "father"指定Father表中列的前綴,防止重複
@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;
}
八.數據庫升級addMigrations(Migration)
MyDatabase instance = Room.databaseBuilder(context.getApplicationContext(), MyDatabase.class, "renzm_upgrade")
//可以強制在主線程運行數據庫操作
.allowMainThreadQueries()
//強制升級
//.fallbackToDestructiveMigration()
.addMigrations(MIGRATION_1_2)
.build();
//進行數據庫升級 version 1 to version 2
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
//在這裏用sql腳本完成數據變化
database.execSQL("alter table myteacher add column flag integer not null default 1");
}
};