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慢,慢不少。
