1、导包:
implementation "androidx.room:room-runtime:2.2.3" annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'
2、添加数据库
@Database(entities = {User.class}, version = 1, exportSchema = false)
public abstract class MyDataBase extends RoomDatabase {
public abstract UserDao getUserDao();
}
3、Application里面初始化
public class AppContext extends Application {
public static MyDataBase myDataBase;
@Override
public void onCreate() {
super.onCreate();
initDataBase();
}
/* 初始化 数据库 */
private void initDataBase() {
Log.v("fwling", "初始化数据库");
myDataBase = Room.databaseBuilder(getApplicationContext(), MyDataBase.class, "User.db")
.build();
}
}
4、建立实体类(get和set方法一定要加上)
@Entity(tableName = "Users")
public class User {
@NonNull
@PrimaryKey
@ColumnInfo(name = "UserId")
private String uuid;
@ColumnInfo(name = "UserName")
private String userName;
@ColumnInfo(name = "Date")
private String date;
@Ignore
public User(String userName) {
this.uuid = UUID.randomUUID().toString();
this.userName = userName;
this.date = SimpleDateFormat.getDateInstance().format(new Date(System.currentTimeMillis()));
}
public User(String uuid, String userName, String date) {
this.uuid = uuid;
this.userName = userName;
this.date = date;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
5、添加UserDao
@Dao
public interface UserDao {
@Query("SELECT * FROM Users")
List<User> getUsers();
@Insert
void addUser(User user);
@Insert
void addAll(List<User> userList);
@Delete
int deleteUser(User user);
@Update
int updateUser(User user);
}
6、使用
获取数据 List<Fruit> users = AppContext.myDataBase.getFruitDao().getFruits(); 插入数据 User user = new User(et.getText().toString()); AppContext.myDataBase.getUserDao().addUser(user); 需要注意的是:数数据库所有的操作都需要在子线程种运行。这里可以配合RxJava来使用
数据库的操作就到这里,结束了。
下面来看一下数据库的升级管理
此次升级,增加了一张Fruit表
1、添加
@Database(entities = {User.class, Fruit.class}, version = 2, exportSchema = false)
public abstract class MyDataBase extends RoomDatabase {
/* 升级数据库的方法 -- 当前为从 版本1 升级到 版本2 */
public static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
// 这里新创建一个Fruit表
database.execSQL("CREATE TABLE `Fruit` (`FruitId` INTEGER NOT NULL, "
+ "`FruitName` TEXT, PRIMARY KEY(`FruitId`))");
}
};
public abstract UserDao getUserDao();
public abstract FruitDao getFruitDao();
}
需要变化的点:
1、表,entities 的注解里面多了一个Fruit表
2、版本号+1 =2
3、添加了一个Migration 、MIGRATION_1_2表示从1升到2的时候需要做的所有操作
4、添加了一个新表对应的FruitDao
2、添加实体类和相应的Dao
实体类:
@Entity(tableName = "Fruit")
public class Fruit {
@NonNull
@PrimaryKey
@ColumnInfo(name = "FruitId")
private Integer FruitId;
@ColumnInfo(name = "FruitName")
private String FruitName;
public Fruit() {
this.FruitName = "default_Fruit_Name";
}
@Ignore
public Fruit(String FruitName) {
this.FruitName = FruitName;
}
@NonNull
public Integer getFruitId() {
return FruitId;
}
public void setFruitId(@NonNull Integer fruitId) {
FruitId = fruitId;
}
public String getFruitName() {
return FruitName;
}
public void setFruitName(String fruitName) {
FruitName = fruitName;
}
}
DAO:
@Dao
public interface FruitDao {
@Query("SELECT * FROM Fruit")
List<Fruit> getFruits();
@Insert
void addFruit(Fruit fruit);
}
3、添加升级操作
public class AppContext extends Application {
public static MyDataBase myDataBase;
@Override
public void onCreate() {
super.onCreate();
initDataBase();
}
/* 初始化 数据库 */
private void initDataBase() {
Log.v("fwling", "初始化数据库");
myDataBase = Room.databaseBuilder(getApplicationContext(), MyDataBase.class, "User.db")
.addMigrations(MyDataBase.MIGRATION_1_2)
.build();
}
}
多了一行:.addMigrations(MyDataBase.MIGRATION_1_2)
以上就是Room的基本使用
下面来看看,GreenDao的基本使用
1、添加依赖(看清楚相应的文字说明,应该添加到哪里。别搞错)
在根项目的build.gradle的buildscript的dependencies下添加greenDao的插件 classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' 项目的module下build.gradle的dependencies添加Green相应的包 //greenDAO配置 compile 'org.greenrobot:greendao:3.2.2' 同时在module(App)下build.gradle添加插件的使用 apply plugin: 'org.greenrobot.greendao'
2、设置版本号、生成目录等
在module(App)的build.gradle 下添加GreenDao的配置信息
//greendao配置
greendao {
//数据库版本号,升级时修改
schemaVersion 1
//生成的DAO,DaoMaster和DaoSession的包路径。默认与表实体所在的包路径相同
daoPackage 'com.fwl.demo.green_dao.db'
}
3、初始化数据库
public class AppContext extends Application {
private static DaoSession daoSession;
@Override
public void onCreate() {
super.onCreate();
initGreenDao();
}
/* 初始化 数据库 */
private void initGreenDao() {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "aserbao.db");
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
}
public static DaoSession getDaoSession() {
return daoSession;
}
}
4、创建实体类
@Entity
public class Student {
@Id(autoincrement = true)
Long id;
String name;//姓名
@Generated(hash = 1097502469)
public Student(Long id, String name) {
this.id = id;
this.name = name;
}
@Generated(hash = 1556870573)
public Student() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
说明:我这边只添加了两个属性
@Id(autoincrement = true)
Long id;
String name;//姓名
get和set是手动、手动、手动生成的
构造方法是自动、自动、自动生成的
5、编译,这步很重要。步骤三的有些报错的地方都是这步编译后导入的包。
具体操作:Build--->Make Project
6、使用:
//查询
List<Student> students = AppContext.getDaoSession().getStudentDao().getSession().loadAll(Student.class);
//添加
Student student=new Student();
student.setName("dsa");
AppContext.getDaoSession().getStudentDao().insert(student);
//删除
AppContext.getDaoSession().getStudentDao().deleteAll();
//更新<查找id为1的Student,并将它的Name改为ABC>
Student students = AppContext.getDaoSession().getStudentDao().getSession().load(Student.class, StudentDao.Properties.Id.eq(1));
student.setName("ABC");
AppContext.getDaoSession().getStudentDao().update(student);
GreenDao的基本使用就是上面这些了。
下面来看看,Room和GreenDao的区别
| GreenDao | Room |
|---|---|
| 开发者只需要规定Entity的属性即可 | 需要规定Entity的属性,需要规定Dao接口 |
| 每次更新Entity需要重新build以生成代码,大型项目build耗时会比较久 | 更新Entity不需要重新build,因为使用的是Dao接口规定的方法,但是需要根据情况更新Dao接口 |
| 只有进行复杂操作时才需要写SQL语句 | 即使是进行简单的条件查询,也要写SQL语句 |
| 有一定的学习成本,需要学习注解、查询、条件语句等API | 学习成本低,基本只需要掌握Room的注解即可 |
最后,两者的速度对比,GreenDao在批量操作数据的情况下,会比Room慢,慢不少。
