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");
}
};