Room 是Google新推出的數(shù)據(jù)庫框架恋日,使用注解的方式簡化的數(shù)據(jù)庫的操作使用弓颈。
Room中有三個(gè)主要的組成部分
- Entity: 與數(shù)據(jù)表對(duì)應(yīng)的實(shí)體類
- DAO: 數(shù)據(jù)庫操作層,每一個(gè)DAO對(duì)應(yīng)一個(gè)Entity
- Database:數(shù)據(jù)庫磷斧,使用注解的方式聲明這個(gè)數(shù)據(jù)庫中的數(shù)據(jù)表贝搁,和版本號(hào),并且包含產(chǎn)生DAO對(duì)象的方法幅垮。
簡單實(shí)例
User.java
@Entity
public class User {
@PrimaryKey
private int uid;
@ColumnInfo(name = "first_name")
private String firstName;
@ColumnInfo(name = "last_name")
private String lastName;
// Getters and setters are ignored for brevity,
// but they're required for Room to work.
}
UserDao.java
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAll();
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
List<User> loadAllByIds(int[] userIds);
@Query("SELECT * FROM user WHERE first_name LIKE :first AND "
+ "last_name LIKE :last LIMIT 1")
User findByName(String first, String last);
@Insert
void insertAll(User... users);
@Delete
void delete(User user);
}
AppDatabase.java
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name").build();
一般Database需要為單例模式
@Database注解中 exportSchema 的默認(rèn)值為true,當(dāng) exportSchema 值為true時(shí) 需要早 app.gradle 中配置 數(shù)據(jù)庫建表的SQL文件導(dǎo)出位置。導(dǎo)出的文件可用于數(shù)據(jù)庫升級(jí)測試尾组。
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
數(shù)據(jù)庫升級(jí)
數(shù)據(jù)庫辦版本升級(jí)時(shí)如果程序不做任何處理忙芒,Room框架將刪除低版本的所有數(shù)據(jù),重新創(chuàng)建數(shù)據(jù)庫讳侨。
數(shù)據(jù)庫升級(jí)的處理方法:
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");
}
};