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,一经查实,立即删除!

相关文章

matlab如何将相近的数据,matlab新手,求帮助!主要是如何将数据和公式导入

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这是别人给我的程序&#xff0c;我想问一下怎么把我的两个excel数据导入&#xff0c;以及公式怎么写&#xff1f;clc;clear all;close all;datadlmread(all_data_in_situ_lxz.txt);data(6,:)[];data(12,:)[];data(13,:)[];data(13,…

Java垃圾回收(1)

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

如果

&#xff08;最近遇到了一些困难&#xff0c;这篇翻译自己一直就很喜欢&#xff0c;贴上来鼓励自己。&#xff09; 如果 吉卜林【英】芮成钢【译】 如果&#xff0c;身边的人都失去理智&#xff0c;并将其归咎于你&#xff0c; 而你却能保持清醒&#xff1b; 如果&#xff0c;所…

深入c#的string类

一.字符串常用方法 1.IndexOf("") 如果找到字符串出现的位置则为索引位置&#xff0c;否则返回-1&#xff0c;索引从0开始 2.string Substring( int startIndex , int length ); 从开始位置startIndex&#xff0c;截取到结束位置&#xff08;截取长度length&#xff…

go语言服务器连接mysql,服务器mysql怎么配置才能远程连接

如何设置MYSQL服务器允许远程连接&#xff1f;如果你使用的与数据库不在同一台服务器上电脑&#xff0c;那么MySQL 服务器就需要允许远程链接&#xff0c;网站才能正常运行。那么如何设置MYSQL服务器允许远程连接呢&#xff1f;我想这是很多人都想提出的疑问&#xff0c;下面是…

h1、h2、h3标签及strong标签对页面seo的影响

今天和大家来聊下h1,h2,h3,strong几个标签&#xff0c;在网页中的使用对页面seo的影响&#xff0c;也阐述了个人的一些想法。 首先简要讲下H标签及strong标签的含义&#xff1a;<h1>、<h2>、<h3>、<h4>、<h5>、<h6>,作为标题使用&#x…

少锁定Java对象池

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

Java (数组的遍历,for循环的使用)

/*多行注释的快捷键&#xff1a;Ctrlshift/ 快速格式化代码快捷键&#xff1a;Ctrlshiftf 自动导入一个包&#xff1a;Ctrlshifto */ package test_1;public class Day_2 {public static void main(String args[]) {//一个九九乘法表的实现int c 0;for (int a 1; a < 9; a…

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…

开始学习前端开发吧

据说最好的输入是输出&#xff0c;所以听我讲给你听我学到的东西吧。 学习前端入门时&#xff0c;无论在哪儿都告诉我们&#xff0c;要学习HTML CSS JS。google之&#xff0c;得到html是超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称…

Java 8 Lambda演练

在工作中&#xff0c;我做了关于Java 8项目lambda的演示&#xff0c;当然还有一些简单的代码来说明其中的一些要点。 Java 8的总体原因是&#xff1a; 更简洁的代码&#xff08;适用于只有一种方法和集合的类&#xff09;。 “我们希望代码的读者在到达lambda表达式的“实质”…

虚拟机vmnet0、vmnet1和vmnet8的区别

vmnet0&#xff0c;实际上就是一个虚拟的网桥 vmnet0&#xff0c;实际上就是一个虚拟的网桥&#xff0c;这个网桥有很若干个端口&#xff0c;一个端口用于连接你的Host&#xff0c;一个端口用于连接你的虚拟机&#xff0c;他们的位置是对等的&#xff0c;谁也不是谁的网关。所以…

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进程及…

OpenHFT Java Lang项目

OpenHFT / Java Lang从Apache 2.0库开始&#xff0c;提供Java Chronicle使用的低级功能&#xff0c;而无需持久存储到文件中。 这允许对数据进行可序列化和反序列化&#xff0c;以及对本机空间&#xff08;堆外&#xff09;中的内存的随机访问。它支持使用对象池写入和读取可枚…

spring cloud-spring boot 文档信息

官网&#xff1a; spring boot springcloud 学习资源 使用IDEA创建SpringBoot项目 Spring Boot教程 https://blog.csdn.net/forezp/article/details/70341818 Spring Cloud教程 http://blog.csdn.net/forezp/article/details/70148833 Spring Cloud教程 http://blog.csdn.net…

python基础学习笔记(十三)

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

OD debug matlab,OllyDebug基本使用方法

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

设计模式:策略

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

css 学习整理

1、 background-attachment :fixed 属性防止背景图片这种滚动&#xff0c;它默认值是 scroll&#xff0c;也就是说&#xff0c;在默认的情况下&#xff0c;背景会随文档滚动2、font-weight 属性设置文本的粗细&#xff08;关键字 100 ~ 900 为字体指定了 9 级加粗度。如果一个字…