安卓持久框架Room VS GreenDao

一 、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(12) {

        @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的区别

GreenDaoRoom
开发者只需要规定Entity的属性即可需要规定Entity的属性,需要规定Dao接口
每次更新Entity需要重新build以生成代码,大型项目build耗时会比较久更新Entity不需要重新build,因为使用的是Dao接口规定的方法,但是需要根据情况更新Dao接口
只有进行复杂操作时才需要写SQL语句

即使是进行简单的条件查询,也要写SQL语句

 

 

有一定的学习成本,需要学习注解、查询、条件语句等API学习成本低,基本只需要掌握Room的注解即可

 

最后,两者的速度对比,GreenDao在批量操作数据的情况下,会比Room慢,慢不少。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值