Room學(xué)習(xí)筆記

Room是android Architecture Components中簡(jiǎn)化數(shù)據(jù)庫(kù)讀寫(xiě)的組件

集成方法:

implementation "android.arch.persistence.room:runtime:1.0.0-rc1"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0-rc1"
testImplementation "android.arch.persistence.room:testing:1.0.0-rc1"
implementation "android.arch.persistence.room:rxjava2:1.0.0-rc1"

Room分為三部分

  • DataBase: 代表一個(gè)數(shù)據(jù)庫(kù)绢片,提供抽象方法訪問(wèn)Dao對(duì)象傻唾。通過(guò)Room.databaseBuilder或者Room.inMemoryDatabaseBuilder創(chuàng)建。
  • Entity:每個(gè)entity類代表一個(gè)table征椒,每個(gè)實(shí)例代表一行
  • Dao: 數(shù)據(jù)訪問(wèn)接口,增刪查Entity的接口

Database

@Database(version = 1, entities = {Entity.class})

mark一個(gè)類是Database類,提供dao的獲取方法,entities指定有哪些表

Entity

 @Entity
 public class User {
   @PrimaryKey
   private int uid;
   private String name;
   @ColumnInfo(name = "last_name")
   private String lastName;
   // getters and setters are ignored for brevity but they are required for Room to work.
 }

@Entity(tableName="", indices={@Index("name")}, foreignKeys={}, primaryKeys="", inheritSuperIndices="")

Entity的構(gòu)造函數(shù)要么或者構(gòu)造函數(shù)的參數(shù)對(duì)應(yīng)到field

tranisent或者@Ignore修飾的field不會(huì)持久化

至少要有一個(gè)@PrimaryKey的field 或者Entity.primaryKeys()定義主鍵

以下注解可以修飾field

@PrimaryKey(autoGenerate=true|false)

@ColumnInfo(index=true|false, collate= UNSPECIFIED|BINARY|NOCASE|RTRIM, name="", typeAffinity= UNDEFINED|TEXT|INTEGER|REAL|BLOB)

構(gòu)造表示時(shí)列的一些屬性

@Embedded(prefix="")

如果field是另外一個(gè)class代嗤,那么這個(gè)class的屬性會(huì)放到主類中

   public class Coordinates {
       double latitude;
       double longitude;
   }
   public class Address {
       String street;
       @Embedded
       Coordinates coordinates;
   }

@Relation(entity = class, entityColumn = "", parentColumn = "", projection = "")

定義一到多的關(guān)系,修飾的field需要是List或者set缠借。用于自動(dòng)獲取關(guān)聯(lián)的relation

 @Entity
 public class Pet {
     @ PrimaryKey
     int id;
     int userId;
     String name;
     // other fields
 }
 public class UserNameAndAllPets {
   public int id;
   public String name;
   @Relation(parentColumn = "id", entityColumn = "userId")
   public List<Pet> pets;
 }

DAO

DAO可以是接口或是抽象類干毅,提供一系列insert,udpate或者delete的函數(shù)

@Insert(onConflict=ABORT|FAIL|IGNORE|REPLACE|ROLLBACK)

將傳入的對(duì)象在一個(gè)transaction中插入數(shù)據(jù)庫(kù)

@Dao
public interface MyDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    public void insertUsers(User... users);

    @Insert
    public void insertBothUsers(User user1, User user2);

    @Insert
    public void insertUsersAndFriends(User user, List<User> friends);
}

@Update(onConflict = ABORT|FAIL|IGNORE|REPLACE|ROLLBACK)

根據(jù)傳入對(duì)象的primaryKey尋找數(shù)據(jù)庫(kù)中的行泼返,修改對(duì)象所在行

@Dao
public interface MyDao {
    @Update
    public void updateUsers(User... users);
}

@Delete

刪除傳入對(duì)象所在行

@Dao
public interface MyDao {
    @Delete
    public void deleteUsers(User... users);
}

@Query

運(yùn)行一段query硝逢,可以是SELECT,UPDATE符隙,DELETE

通過(guò):name來(lái)在query中引用方法參數(shù)

用返回的column來(lái)構(gòu)建返回對(duì)象

@Dao
public interface MyDao {
    @Query("SELECT * FROM user")
    public User[] loadAllUsers();
}

TypeConverter

當(dāng)有自定義類文件要轉(zhuǎn)化成Room可以持久化的數(shù)據(jù)類型時(shí)趴捅,需要定義TypeConverter

public class Converters {
    @TypeConverter
    public static Date fromTimestamp(Long value) {
        return value == null ? null : new Date(value);
    }

    @TypeConverter
    public static Long dateToTimestamp(Date date) {
        return date == null ? null : date.getTime();
    }
}

然后在Database類上指定TypeConverter定義的類

@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

Migration

用于指定從低version升級(jí)到高version時(shí),進(jìn)行的數(shù)據(jù)庫(kù)操作

Room.databaseBuilder(getApplicationContext(), MyDb.class, "database-name")
        .addMigrations(MIGRATION_1_2, MIGRATION_2_3).build();

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("CREATE TABLE `Fruit` (`id` INTEGER, "
                + "`name` TEXT, PRIMARY KEY(`id`))");
    }
};

static final Migration MIGRATION_2_3 = new Migration(2, 3) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("ALTER TABLE Book "
                + " ADD COLUMN pub_year INTEGER");
    }
};

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末霹疫,一起剝皮案震驚了整個(gè)濱河市拱绑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丽蝎,老刑警劉巖猎拨,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膀藐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡红省,警方通過(guò)查閱死者的電腦和手機(jī)额各,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吧恃,“玉大人虾啦,你說(shuō)我怎么就攤上這事『墼ⅲ” “怎么了傲醉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)呻率。 經(jīng)常有香客問(wèn)我硬毕,道長(zhǎng),這世上最難降的妖魔是什么礼仗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任吐咳,我火速辦了婚禮,結(jié)果婚禮上元践,老公的妹妹穿的比我還像新娘韭脊。我一直安慰自己,他們只是感情好卢厂,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布乾蓬。 她就那樣靜靜地躺著惠啄,像睡著了一般慎恒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撵渡,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天融柬,我揣著相機(jī)與錄音,去河邊找鬼趋距。 笑死粒氧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的节腐。 我是一名探鬼主播外盯,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼翼雀!你這毒婦竟也來(lái)了饱苟?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤狼渊,失蹤者是張志新(化名)和其女友劉穎箱熬,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡城须,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年蚤认,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糕伐。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砰琢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出良瞧,到底是詐尸還是另有隱情氯析,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布莺褒,位于F島的核電站掩缓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏遵岩。R本人自食惡果不足惜你辣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尘执。 院中可真熱鬧舍哄,春花似錦、人聲如沸誊锭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)丧靡。三九已至蟆沫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間温治,已是汗流浹背饭庞。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熬荆,地道東北人舟山。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像卤恳,于是被迫代替她去往敵國(guó)和親累盗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容