一 、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的区别

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

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

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

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

安卓持久框架Room VS GreenDao相关推荐

  1. 安卓表格框架-ExcelView

    转载请标明来源:安卓表格框架-ExcelView_分享+记录-CSDN博客 Github地址,欢迎star:https://github.com/September26/ExcelView 一.项目介 ...

  2. 安卓MediaPlayer框架之Binder机制

    Binder简介 Binder是Android系统进程间通信的主要方式之一. 1.在ASOP中,Binder使用传统的C/S通信方式:即一个进程作为服务端提供诸如视音频解封装,解码渲染,地址查询等各种 ...

  3. 框架下载_最新安卓XDA框架插件下载仓库

    小技能 大乐趣每周小小黑科技技能.软件.干货.影院 微信1秒I语音Mp3|音乐转码器制作语音点歌 有了它再也不用到处找框架模块资源 最新20190502版本 陪伴是最长情的告白 Xposed框架激活 ...

  4. JDO持久框架——DataNucles

    1. JDO框架简介 Java数据对象(Java Data Objects,JDO)是一个应用程序接口(API),它是Java程序员能够间接地访问数据库,也就是说,不需使用直接的结构化查询语言(SQL ...

  5. android安卓-开源框架汇总

    原帖: 跳转 1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1) JSON,图像等的异步下载: (2) 网络请求的排序(sch ...

  6. 安卓常用框架、模块、软件

    为了避免问题 都先开启开发者模式 开启usb安装.调试.停用adb授权超时功能 面具 Riru和Zygisk 简单说来 就是Zygisk更强悍,riru以及停止更新了,但部分老插件可能只支持riru ...

  7. 安卓网络框架,上传图片花图,上传状态411被服务器驳回

    先看下一开始使用的网络框架核心代码: private Message doPost(final String url, final Map<String, String> params, ...

  8. android 开源框架mvvm,relight: A light MVVM framework for Android. 一个轻量级的安卓MVVM框架...

    优势 稳定 减少内存泄漏:新手很容易在线程切换的地方写出导致内存泄漏的代码,但如果把线程切换交给框架来做,出错的概率就大大降低. 减少 crash:根据我的开发经历,大部分 crash 都是空指针导致 ...

  9. 安卓SurfaceFlinger框架初探

    大家都知道SurfaceFlinger是安卓图形的引擎.安卓view的显示,OpenGL的显示必须通过SurfaceFlinger,才能显示到屏幕上. 按照常理,大部分开发者不喜欢文字,我也一样.另外 ...

  10. uiautomator2安卓测试框架报No tests found for given includes

    uiautomator2测试框架报No tests found for given includes,意思是找不到测试类: 怀疑是项目没编译成功,但是android statio的gradle没有bu ...

最新文章

  1. 使用第三方工具覆写Object中方法
  2. lib和dll文件的区别和联系
  3. python-day22(序列化)
  4. ITK:将像素缓冲区导入到图像中
  5. 任正非:华为三十年大限快到了,想不死就得新生
  6. 60个Java练手项目案例,看了让你茅塞顿开~
  7. 连锁零售多门店收银系统源码
  8. Kafka的Topic删不掉
  9. 分享5个高质无损音乐网站,歌曲很丰富,爱听歌的小伙伴有耳福了
  10. 服务器usb驱动安装系统安装失败怎么办,USB3.0驱动无法安装失败怎么办?USB驱动失败失败的解决方法...
  11. 跨时区存储跨时区展示时间 | js 获取当前UTC时间
  12. 七大黄金定律与产品设计
  13. 关于个人网贷查询系统网贷信用查询,公司开发图片整合技术
  14. 计算机不显示验证码,浏览器中网页验证码不显示的原因与解决办法
  15. cαr怎么发音_最全英语口语发音规则与技巧
  16. $reday和window.onload()
  17. 数字图像处理 总复习(第七章)*秋昊
  18. 6000字长文,带你用Python完成 “Excel合并(拆分)” 的各种操作!
  19. (CVE-2020-11800)Zabbix_Server_trapper_命令注入漏洞
  20. 在两台 ubuntu 之间传输大文件

热门文章

  1. AR涂涂乐⭐九、视频展示及涂涂乐源文件
  2. 如何获取和发现用户需求
  3. 系统全面的认识Solr
  4. 黑产用“未来武器”破解验证码
  5. 1021.Deepest Root
  6. 奇迹暖暖登录显示服务器满,奇迹暖暖登录不是全屏
  7. Bootstrap3源码分析
  8. 复合函数的极限与连续
  9. Python的Excel/Word库
  10. 【博闻强记】java来发送邮件