Room:数据库封装
1.Entity 基本
2.interface 基本
3.Database 基本
4.ViewModel 封装整个流程,代替present
5.Util:封装数据
Room包含3个重要组件:
- Database:包含数据库容器,并作为到应用程序的持久关系数据的基础连接的主要访问点
- Entity:表示数据库中的一个表。
- DAO:包含用于访问数据库的方法
数据库注意地方:
1.唯一的对象
2.多线程
1.如果要删除一个字段怎么办?数据库迁移,因为不支持直接删
2.asyncTask,里面有个进度的方法
3.viewModel用法和room结合。update方法用它得观察者监听
AndroidViewModel
4.room对kotlin非常好的支持
6.是否是一个bean一个数据库?
7.是否支持一个库多个表?
@Database(entities = {User.class, Book.class}, version = 3)
mAppDatabase = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "android_room_dev.db")
.allowMainThreadQueries()
.addMigrations(MIGRATION_1_2, MIGRATION_2_3)
.build();
8.room要自己些线程,而greendao封装好了
9.studio有插件可以直接看数据库
10.room数据库升级,要写多个Migration2——3,3--4
巨大的缺点,升级很麻烦:
/**
* 数据库版本 1->2 user表格新增了age列
*/
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE user " + " ADD COLUMN age INTEGER");
}
};
优点:
设置索引
数据库索引用于提高数据库表的数据访问速度的。数据库里面的索引有单列索引和组合索引。Room里面可以通过@Entity的indices属性来给表格添加索引。
设置外键
因为SQLite是关系形数据库,表和表之间是有关系的。这也就是我们数据库中常说的外键约束(FOREIGN KEY约束)。Room里面可以通过@Entity的foreignKeys属性来设置外键。我们用一个具体的例子来说明。
比较:
1.greendao有好多功能无法实现,配合rxjava,和google的架构组件
多表有点问题
2.room 升级数据库和异步请求问题和性能问题
使用:
implementation "android.arch.persistence.room:runtime:1.1.0"
annotationProcessor "android.arch.persistence.room:compiler:1.1.0"
/**
* 通过@Entity 注解 建立一个表
*/
@Entity
public class Student {
@PrimaryKey(autoGenerate = true) int id;
@ColumnInfo String name;
@ColumnInfo String sex;
@ColumnInfo int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
(3)创建数据库
/**
* 创建数据库
* 通过entities 指定数据库中的表
* version指定当前数据库版本号
*/
@Database(entities = {Student.class},version = 1)
public abstract class RoomDbManager extends RoomDatabase {
public abstract StudentDao getStudentDao();
}
(4)创建访问数据库的方法
/**
* 创建访问数据库的方法
*/
@Dao
public interface StudentDao {
@Insert
void insertOne(Student student);
@Delete
void deleteOne(Student student);
@Update
void update(Student student);
@Query("SELECT * FROM Student")
List<Student> getAll();
}
(5)使用步骤
private RoomDbManager roomDb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//步骤一:获取数据库实例
if (room_blcs == null) {
roomDb= Room.databaseBuilder(getApplicationContext(),
RoomDbManager.class, "room_blcs").build();
}
//步骤二:获取访问数据库的方法实例
StudentDao studentDao = roomDb.getStudentDao();
//步骤三:访问StudentDao 方法执行数据库操作:增删改查
//注:这些方法不能在主线程(UI线程)上执行,需要创建新的线程来执行这些耗时操作。
//增:studentDao.insertOne(student);
//删:studentDao.deleteOne(student)
//改:studentDao.update(student)
//查:List<Student> all = studentDao.getAll()
}