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