一 、Room的基本使用
1、导包:
1 2 | implementation "androidx.room:room-runtime:2.2.3" annotationProcessor 'android.arch.persistence.room:compiler:1.1.1' |
2、添加数据库
1 2 3 4 5 6 | @Database (entities = {User. class }, version = 1 , exportSchema = false ) public abstract class MyDataBase extends RoomDatabase { public abstract UserDao getUserDao(); } |
3、Application里面初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class AppContext extends Application { public static MyDataBase myDataBase; @Override public void onCreate() { super .onCreate(); initDataBase(); } /* 初始化 数据库 */ private void initDataBase() { myDataBase = Room.databaseBuilder(getApplicationContext(), MyDataBase. class , "User.db" ) .build(); } } |
4、建立实体类(get和set方法一定要加上)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | @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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @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、使用
1 2 3 4 5 6 7 8 | 获取数据 List<Fruit> users = AppContext.myDataBase.getFruitDao().getFruits(); 插入数据 User user = new User(et.getText().toString()); AppContext.myDataBase.getUserDao().addUser(user); 需要注意的是:数数据库所有的操作都需要在子线程种运行。这里可以配合RxJava来使用 |
数据库的操作就到这里,结束了。
下面来看一下数据库的升级管理
此次升级,增加了一张Fruit表
1、添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | @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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 实体类: @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、添加升级操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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、添加依赖(看清楚相应的文字说明,应该添加到哪里。别搞错)
1 2 3 4 5 6 7 8 9 10 | 在根项目的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、设置版本号、生成目录等
1 2 3 4 5 6 7 8 9 | 在module(App)的build.gradle 下添加GreenDao的配置信息 //greendao配置 greendao { //数据库版本号,升级时修改 schemaVersion 1 //生成的DAO,DaoMaster和DaoSession的包路径。默认与表实体所在的包路径相同 daoPackage 'com.fwl.demo.green_dao.db' } |
3、初始化数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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、创建实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | @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、使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //查询 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慢,慢不少。