46. Room數(shù)據(jù)庫(kù)的使用

引用:

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);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容