46. Room數據庫的使用

引用:

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");
     }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章