Android GreenDao使用教程

一、Greendao简介

 

     Greendao是一款用于数据库创建与管理的框架,由于原生SQLite语言比较复杂繁琐,使得不少程序员不得不去学习SQLite原生语言,但是学习成本高,效率低下,所以不少公司致力于开发一款简单的数据库管理框架,较为著名的就有Greendao和ORMLite,但是就数据分析来看,Greendao的效率是高于ORMLite及其他框架的,是目前该行业的领先者。也因为Greendao的使用方法简便,且效率高使得其成为目前使用最为广泛的数据库管理框架,这也是广大程序员的福音。

 

二、Greendao的使用方法

 

1.添加依赖

 

 在bulid.gradle文件下的dependencies下添加所需依赖

 
  1. compile 'org.greenrobot:greendao:3.2.2' // add library

  2. compile 'org.greenrobot:greendao-generator:3.2.2'

 

2.在bulid.gradle下进行配置

 

 
  1. apply plugin: 'org.greenrobot.greendao'

  2. buildscript {

  3. repositories {

  4. mavenCentral()

  5. }

  6. dependencies {

  7. classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'

  8. }

  9. }

 

3.对greendao的generator生成文件进行配置

 

 

 
  1. greendao {

  2. schemaVersion 1 //版本

  3. daoPackage '生成文件包名' // 一般为app包名+生成文件的文件夹名

  4. targetGenDir 'src/main/java' //生成文件路径

  5. }

 

4.创建实体类,生成dao文件

 

 
  1. @Entity

  2. public class dayStep {

  3.     @Id

  4.     private long id;

  5.     private String date;

  6.     private int step;  

  7.     private Long sportId;

  8.     @ToOne(joinProperty = " sportId")

  9.     private SportInfo sportInfo;//关系表

  10. }

注意:编写完实体类以后在实体类界面下按下Ctrl+F9(Make project),程序会自动编译生成dao文件,生成的文件一共有三个。

 

 

Greendao生成文件

 

5.使用Greendao

 

 

(1)创建一个application类,在application中完成DaoSession的初始化,避免以后重复初始化,便于使用。

 
  1. public class MyApplication extends Application {

  2.     private DaoMaster.DevOpenHelper mHelper;

  3.     private SQLiteDatabase db;

  4.     private DaoMaster mDaoMaster;

  5.     private DaoSession mDaoSession;

  6.     //静态单例

  7.     public static MyApplication instances;

  8.     @Override

  9.     public void onCreate() {

  10.         super.onCreate();

  11.         instances = this;

  12.         setDatabase();

  13.     }

  14.     public static MyApplication getInstances(){

  15.         return instances;

  16.     }

  17.  
  18.     /**

  19.      * 设置greenDao

  20.      */

  21.     private void setDatabase() {

  22.         // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。

  23.         // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。

  24.         // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。

  25.         // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。

  26.         mHelper = new DaoMaster.DevOpenHelper(this, "sport-db", null);

  27.         db = mHelper.getWritableDatabase();

  28.         // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。

  29.         mDaoMaster = new DaoMaster(db);

  30.         mDaoSession = mDaoMaster.newSession();

  31.     }

  32.     public DaoSession getDaoSession() {

  33.         return mDaoSession;

  34.     }

  35.     public SQLiteDatabase getDb() {

  36.         return db;

  37.     }

  38. }

 

(2)Greendao操作数据库文件(增,删,改,查)

 
  1.   /**

  2.      * 增

  3.      */

  4.     public void insert()

  5.     {

  6.         String date = new Date().toString();

  7.         mDayStep = new dayStep(null,date,0);//第一个是id值,因为是自增长所以不用传入

  8.         dao.insert(mDayStep);

  9.     }

  10.  
  11.  
  12.     /**

  13.      * 查

  14.      */

  15.     public void Search()

  16.     {

  17.         //方法一

  18.         List<dayStep> mDayStep = dao.loadAll();

  19.         //方法二

  20.         //List<dayStep> mDayStep = dao.queryBuilder().list();

  21.         //方法三 惰性加载

  22.         //List<dayStep> mDayStep = dao.queryBuilder().listLazy();

  23.         for (int i = 0; i < mDayStep.size(); i++) {

  24.             String date = "";

  25.             date = mDayStep.get(i).getDate();

  26.             Log.d("cc", "id:  "+i+"date:  "+date);

  27.         }

  28.  
  29.  
  30.     }

  31.  
  32.  
  33.     /**

  34.      * 删

  35.      * @param i 删除数据的id

  36.      */

  37.     public void delete(long i)

  38.     {

  39.         dao.deleteByKey(i);

  40.         //当然Greendao还提供了其他的删除方法,只是传值不同而已

  41.     }

  42.  
  43.  
  44.     /**

  45.      *改

  46.      * @param i

  47.      * @param date

  48.      */

  49.     public void correct(long i,String date)

  50.     {

  51.         mDayStep =  new dayStep((long) i,date,0);

  52.         dao.update(mDayStep);

  53.     }

  54.  
  55.  
  56.    /**

  57.      *修改或者替换(有的话就修改,没有则替换)

  58.      */ 

  59.     public void insertOrReplace(long i,String date)

  60.   {

  61.       mDayStep = new dayStep((long) i,date,0);

  62.       dao.insertOrReplace(mDayStep);

  63.     }

  64.  
  65.  
  66.    /**

  67.      *查找符合某一字段的所有元素

  68.      */

  69.    public void searchEveryWhere(String str)

  70.    {

  71. List<dayStep> mList = dao.queryBuilder()

  72.                 .where(dao.date.eq(str)).build().listLazy();

  73.    }

(3)通过where查询指定数据

 
  1. /**

  2. * 查询指定用户

  3. */

  4. public static List<UserInfo> SearchUserInfo(int id)

  5. {

  6. //惰性加载

  7. List<UserInfo> list = mUserInfoDao.queryBuilder().where(UserInfoDao.Properties.Id.eq(id)).list();

  8. return list;

  9. }

 

 

 

三、多表关联

 

一对一与一对多概念几乎类似,我们在这里就只做一对多的讲解(我们实现一个用户有多张运动表,运动表就是用户表的儿子表,而用户表则是运动表的父表)

运动表

 
  1. @Entity

  2. public class SportInfo {

  3. @Id

  4. private Long sportId;

  5. //日期

  6. private String date = "";

  7. private Long UserId;

  8. @ToOne(joinProperty = "UserId")

  9. private UserInfo userInfo;//关系表

  10. }

用户表

 
  1. @Entity

  2. public class UserInfo {

  3. @Id

  4. private Long id;

  5. //账号

  6. private String number;

  7. //密码

  8. private String password;

  9. //昵称

  10. private String nick_name;

  11. //一对多关联

  12. @ToMany(referencedJoinProperty = "sportId")

  13. private List<SportInfo> sportInfo;

  14. }

多表关联的增删改查(我已封装成了方法方便使用)

 
  1. public class DataBaseTool {

  2.  
  3. private static SportInfoDao mSportInfoDao = MyApplication.getInstances().getDaoSession().getSportInfoDao();

  4. private static UserInfoDao mUserInfoDao = MyApplication.getInstances().getDaoSession().getUserInfoDao();

  5. /**

  6. * 增加运动信息

  7. */

  8. public static long insertSportInfo(UserInfo userInfo,SportInfo sportInfo)

  9. {

  10. sportInfo.setUserId(userInfo.getId());//增加运动表时要指定其父表(用户表id和用户表)

  11. sportInfo.setUserInfo(userInfo);

  12. return mSportInfoDao.insertOrReplace(sportInfo);

  13. }

  14. /**

  15. * 增加用户信息

  16. */

  17. public static long insertUserInfo(UserInfo info)

  18. {

  19. return mUserInfoDao.insertOrReplace(info);

  20. }

  21.  
  22. /**

  23. * 查运动信息

  24. */

  25. public static List<SportInfo> SearchSportInfo(UserInfo userInfo)

  26. {

  27. return userInfo.getSportInfo();//查找运动表则需要通过用户表来获取运动表的集合然后再遍历找到所需运动表

  28. }

  29.  
  30. /**

  31. * 查用户信息

  32. */

  33. public static List<UserInfo> SearchUserInfo()

  34. {

  35. //惰性加载

  36. List<UserInfo> list = mUserInfoDao.queryBuilder().listLazy();

  37. return list;

  38. }

  39.  
  40. /**

  41. * 删除某条用户信息

  42. * @param i 删除数据的id

  43. */

  44. public static void deleteUserInfo(long i)

  45. {

  46. mUserInfoDao.deleteByKey(i);

  47. //当然Greendao还提供了其他的删除方法,只是传值不同而已

  48. }

  49.  
  50. /**

  51. *修改某条运动信息

  52. */

  53. public static void correctSportInfo(SportInfo info)

  54. {

  55. mSportInfoDao.update(info);

  56. }

  57.  
  58. /**

  59. *修改某条用户信息

  60. */

  61. public static void correctUserInfo(UserInfo info)

  62. {

  63. mUserInfoDao.update(info);

  64. }

  65. }


 

四、Greendao注解含义

 

(1)@Entity 实体标识
     @nameInDb 在数据库中的名字,如不写则为实体中类名
     @indexes 索引
     @createInDb 是否创建表,默认为true,false时不创建
     @schema 指定架构名称为实体
     @active 无论是更新生成都刷新
(2)@Id 每条数据对应的位置,必写项
(3)@Property(nameInDb = "") 表示该属性将作为表的一个字段,其中nameInDb属性值是在数据库中对应的字段名称,可以自定义字段名,例如可以定一个跟实体对象字段不一样的字段名
(4)@NotNull 不为null
(5)@Unique 唯一约束   该属性值必须在数据库中是唯一值
(6)@ToMany 一对多
(7)@OrderBy 排序
(8)@ToOne 一对一 关系表
(9)@Transient 不保存于数据库
(10)@generated 由greendao产生的构造函数或方法

 

五、Greendao特性

 

  • 精简
  • 高效率
  • 低功耗
  • 使用方便

转载于:https://www.cnblogs.com/JaxX/p/9919193.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java垃圾回收(1)

这是有关垃圾收集&#xff08;GC&#xff09;的系列文章中的第一篇。 我希望能够涵盖整个系列过程中的理论知识以及热点虚拟机中的所有主要收集器。 这篇文章仅说明什么是垃圾回收&#xff0c;以及不同回收器共有的元素。 我为什么要在乎&#xff1f; 您的Java虚拟机可以为您管…

少锁定Java对象池

自从我写任何东西以来已经有一段时间了&#xff0c;我一直在忙于我的新工作&#xff0c;该工作涉及在性能调整方面做一些有趣的工作。 挑战之一是减少应用程序关键部分的对象创建。 尽管Java随着时间的推移改进了GC算法&#xff0c;但垃圾回收打h一直是Java的主要难题。 Azul是…

php数据库postgresql,PHP 操作 PostgreSQL数据库

1.要让PHP支持PostgreSQL&#xff0c;就需要重新编译PHP&#xff1b;./configure --prefix/usr/local/php5 --with-apxs2/usr/local/apache2/bin/apxs --with-mysql/usr/local/mysql --with-config-file-path/usr/local/php5 --with-zlib --enable-mbstringall --with-mysql…

uestc summer training #2

A 增广 #include<bits/stdc.h> using namespace std; const int MAXN 1000000 10; vector<int> g[MAXN]; int a[MAXN], b[MAXN], sz[MAXN], cnt[MAXN]; bool mg[MAXN], vis[MAXN]; int n, m; bool dfs(int u, int f -1) {if (g[u].empty()) //如果当前数没有位…

mysql有实例名这个概念,MySQL的一些概念笔记

1.MySQL Server、MySQL实例、MySQL数据库MySQL数据库指的是实际存在的物理操作系统文件的集合&#xff0c;也可以指逻辑数据的集合。为了访问、处理数据&#xff0c;我们需要一个数据库管理系统&#xff0c;也就是MySQL Server(也称为MySQL服务器)。MySQL实例指的是MySQL进程及…

python基础学习笔记(十三)

re模块包含对 正则表达式。本章会对re模块主要特征和正则表达式进行介绍。 什么是正则表达式 正则表达式是可以匹配文本片段的模式。最简单的正则表达式就是普通字符串&#xff0c;可以匹配其自身。换包话说&#xff0c;正则表达式’python’ 可以匹配字符串’python’ 。你可以…

OD debug matlab,OllyDebug基本使用方法

OD是逆向过程中最好的动态调试工具&#xff0c;这次来记录学习笔记。(特别鸣谢石总)1、OD的工作界面最开始要学的就是界面的使用N了吧&#xff0c;这里分各个框来解释下&#xff1a;列举各个框用处&#xff1a;可以看到下面一框框东西&#xff1a;这些一时半会用不到&#xff0…

设计模式:策略

这次我想谈谈策略设计模式 。 通过这种方式&#xff0c;我开始撰写有关行为设计模式的文章。 这些模式表示对象之间的某些交互模式&#xff0c;以使代码更灵活且组织得更好。此方法的最本质点是对象之间的松散耦合。 当您的应用程序中有多个实现目的的实现时&#xff0c;应使用…

本地搭建WordPress (XAMPP环境)

1&#xff0c;XAMPP是一个流行的PHP开发环境&#xff0c;官网下载&#xff1a; https://www.apachefriends.org/zh_cn/index.html 然后安装。 官方介绍&#xff1a;XAMPP是最流行的PHP开发环境 XAMPP是完全免费且易于安装的Apache发行版&#xff0c;其中包含MariaDB、PHP和Pe…

CSS3 选择器——属性选择器

上一节在《CSS3选择器——基本选择器》中主要介绍了CSS3选择器的第一部分&#xff0c;这节主要和大家一起来学习CSS3选择器的第二部分——属性选择器。属性选择器早在CSS2中就被引入了&#xff0c;其主要作用就是对带有指定属性的HTML 元素设置样式。使用CSS3属性选择器&#x…

设计模式:生成器

有时需要在应用程序中创建一个复杂的对象。 一种解决方案是Factory模式&#xff0c;另一种是Builder设计模式。 在某些情况下&#xff0c;您甚至可以结合使用这两种模式。 但是在本文中&#xff0c;我想研究一下Builder设计模式 。 我需要说的第一件事是创造模式。 在什么情况…

css平行四边形与菱形变换

*以下技巧均源自于Lea Verou所著《CSS Secrets》 平行四边形 平行四边形的构造可以基于矩形通过skew()的变形属性进行斜向拉升得到&#xff08;skew所用的坐标系&#xff0c;纵向是X轴&#xff0c;横向是Y轴&#xff0c;与常见的坐标系相反&#xff09;。 <!DOCTYPE html&g…

设计模式:原型

创新设计模式之一是原型设计模式 。 尽管原型是创造模式&#xff0c;但它在概念上与其他模式有所不同。 我的意思是原型在某种意义上创造了自己。 我将在下面解释。 原型模式的所有魔力都基于Java Object的clone&#xff08;&#xff09;方法。 因此&#xff0c;让我们考虑一…

SecureCRT连接AWS EC2云主机密码登录

申请了亚马逊的EC2&#xff0c;要通过ssh 加密钥的形式登录&#xff0c;特别麻烦&#xff0c;而且感觉ssh登录AWS的云主机后好卡&#xff0c;这里是更改成用户名和密码的形式登录云主机&#xff0c;可以通过SecureCRT直接登录 1、首先通过ssh登录到EC2&#xff0c;类似于ssh -i…

母版页

一、母版页简介 使用 ASP.NET 母版页可以为应用程序中的页创建一致的布局。单个母版页可以为应用程序中的所有页&#xff08;或一组页&#xff09;定义所需的外观和标准行为。 母版之所以称为母版&#xff0c;就是将大部分网页上固定内容&#xff0c;比如导航栏&#xff0c;版…

openLayers 4 canvas图例绘制,canvas循环添加图片,解决图片闪烁问题

一、问题来源&#xff1a; 接触Openlayers 一段时间了&#xff0c;最近做了一个农业产业系统&#xff0c;项目中涉及到产业图例&#xff0c;最后考虑用canvas来绘制图例图像。当中带图片的图例移动时&#xff0c;图片会实现闪烁留白情况。闪烁是因为绘制图片本身的复杂性&#…

Java DB嵌入式模式

Java DB是基于Java编程语言和SQL的关系数据库管理系统。 这是Apache软件基金会的开源Derby项目的Oracle版本。 Java SE 7 SDK中包含Java DB。 Java DB有两个部署选项&#xff1a; Embedded和Network Server 。 这篇文章是关于嵌入式部署或模式的。 1.嵌入式 在嵌入式模式下&…

清除浮动方法解析

清除浮动方法解析 清除浮动带来的额外影响 如果对于浮动不熟悉的同学&#xff0c;可以看看介绍float的文章。传送门&#xff1a;CSS float 我们知道&#xff0c;在一个父元素内如果遇到某个浮动元素&#xff0c;此时父元素的高度会发生塌陷。针对父元素高度塌陷的问题&#xff…

进程间的通信----管道

前提&#xff1a;本文是基于Linux系统下的学习 用户态的进程是如何组织的呢&#xff1f;所有的用户态进构成了一棵树。进程树。 进程树的树根是init.也就是1号进程。是用户态进程的祖宗进程。如何查看进程树&#xff1f;pstree 进程之间的关系 父子进程和兄弟进程查看进程的信息…

web项目启动时,自动执行代码的几种方式

在项目开发过程中&#xff0c;往往需要一些功能随着项目启动而优先启动&#xff0c;下面我总结几种方式&#xff08;非spring boot&#xff09; spring boot的参考 spring boot 学习之路9 (项目启动后就执行特定方法) 方式一&#xff1a; ServletContextListener监听器&#…