GreenDao使用

GreenDao是一个关系型数据库,可方便的利用对象操作数据库,更可以利用其ORM的继承特性,整合代码编写。个人感觉就是给对于sql不熟练的我提供一个可以操作数据库的捷径。

GreenDao 官方地址:http://greenrobot.org/greendao/

GreenDao gitHub地址:https://github.com/greenrobot/greenDAO

本篇例程:http://download.csdn.NET/detail/xiaoleiacm/9538119

GreenDao的工程建立:

1 AS:在APP的Gradle中加入:(需要在GitHub上查找最新的版本)

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. compile 'org.greenrobot:greendao:2.2.0'  

2 建立一个java-gen


在APP的Gradle中的Android下加入:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. sourceSets{  
  2.        main{  
  3.            java.srcDirs=['src/main/java','src/main.java-gen']  
  4.        }  
  5.    }  


3 新建一个java Library

 

命名为:

Library Name:greendaogenerator

Class Name:ExampleDaoGenerator (用于生成表对象)


生成如图结构


4  在greendaogenerator的Gradle中添加

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. compile 'org.greenrobot:greendao-generator:2.2.0'  

通过以上的设置已完成基本的Gradle设置。

ExampleDaoGenerator类是为了生成数据库表而建立的一个节点类,它需要完成数据库版本的建立,节点的建立,以及设置GreenDao核心代码的路径。
 
 
 
[java] view plain copy
在CODE上查看代码片 派生到我的代码片
  1. package com.example;  
  2.   
  3. import de.greenrobot.daogenerator.DaoGenerator;  
  4. import de.greenrobot.daogenerator.Entity;  
  5. import de.greenrobot.daogenerator.Schema;  
  6.   
  7. public class ExampleDaoGenerator {  
  8.     public static void main(String[] args) {  
  9.         //生成实体类entity 即对应的表  
  10.         Schema schema = new Schema(1"com.student.entity");  
  11.         //添加节点  
  12.         addStudent(schema);  
  13.   
  14.         schema.setDefaultJavaPackageDao("com.student.dao");// 设置数据的会话层  
  15.   
  16.   
  17.         //将生成的内容放在指定的路径下C:\Users\admin\Desktop\shujuku\MyApplication\app\src\main\java-gen  
  18.         try {  
  19.             new DaoGenerator().generateAll(schema, "/Users/admin/Desktop/shujuku/MyApplication/app/src/main/java-gen");  
  20.         } catch (Exception e) {  
  21.             e.printStackTrace();  
  22.         }  
  23.   
  24.     }  
  25.   
  26.     创建数据库的表  
  27.     private static void addStudent(Schema schema) {  
  28.   
  29.         Entity entity = schema.addEntity("Student"); //创建数据库的表  
  30.   
  31.   
  32.         /** 
  33.          * 设置字符串获其他类型为主键 
  34.          * entity.addStringProperty("身份证号").primaryKey(); 
  35.          */  
  36.         //当前表中的列  
  37.   
  38.         entity.addIdProperty();// 主键  
  39.         entity.addStringProperty("name");  
  40.         entity.addStringProperty("address");  
  41.         entity.addIntProperty("age");  
  42.   
  43.     }  
  44.   
  45.   
  46. }  

生成GreenDao的CoreCode

运行ExampleDaoGenerator类,可以在Java-gen目录下生成相应的Student表的核心代码。
 

DaoMaster: 维护GreenDao数据库的对象,管理Dao生成的类

DaoSession:GreenDao的会话层,提供数据库的增删改查功能。

xxDao(StudentDao):比DaoSession更加具体的会话层,提供批量插入,Count等功能

Student:Student表的对象,里面包含着Student的表操作。

通过以上四个文件即可完成对关系对象型数据库GreenDao的操作。

GreenDao数据库的再封装:

由于数据库需要创建等有着大量的重复代码,可对GreenDao再封装。封装可分为数据库初始化,以及数据库调用接口。

数据库初始化:

由于数据库的操作,可使用的是单例模式,这样在创建DaoMaster时可使用synchronized防止出现多个数据库对象,保证了数据库的安全性。

对于数据库的初始化,可直接应用在其他工程中:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.example.admin.myapplication.dbManager;  
  2.   
  3. import android.content.Context;  
  4.   
  5. import com.example.admin.myapplication.Dao.DaoMaster;  
  6. import com.example.admin.myapplication.Dao.DaoSession;  
  7.   
  8. import de.greenrobot.dao.query.QueryBuilder;  
  9.   
  10. /** 
  11.  * 1 创建数据库 
  12.  * 2 创建数据库表 
  13.  * 3 创建数据库的增删查改 
  14.  * 4 对数据库的升级 
  15.  * Created by admin on 2016/5/31. 
  16.  */  
  17. public class DaoManager {  
  18.     private static final String TAG = DaoManager.class.getSimpleName();  
  19.     private static final String DB_NAME = "mydb.sqlite";  //声明数据库  
  20.     private volatile static DaoManager manager; //多线程名称  
  21.     private static DaoMaster.DevOpenHelper helper;  
  22.   
  23.     private static DaoMaster daomaster;  
  24.     private static DaoSession daoSession;  
  25.   
  26.     private Context context;  
  27.   
  28.     public void init(Context context) {  
  29.         this.context = context;  
  30.     }  
  31.   
  32.     /** 
  33.      * 1 数据库类的创建 
  34.      * 线程安全创建DaoManager,使用单例模式获得操作数据库的对象 
  35.      * 
  36.      * @return note:为保证数据库的有效性,采用单利模式进行访问 
  37.      */  
  38.     public static DaoManager getInstance() {  
  39.   
  40.             DaoManager instance = null;  
  41.             if (manager == null) {  
  42.                 synchronized (DaoManager.class) {  
  43.                     if (instance == null) {  
  44.                         instance = new DaoManager();  
  45.                         manager = instance;  
  46.                     }  
  47.                 }  
  48.             }  
  49.             return instance;  
  50.     }  
  51.   
  52.     /** 
  53.      * 2 Master类的创建 
  54.      * 得到DaoMaster 
  55.      * 
  56.      * @return note:系统帮助用户监测是否有数据库,如果没有,则创建数据库 
  57.      */  
  58.     public DaoMaster getDaoMaster() {  
  59.         if (daomaster == null) {  
  60.             DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, DB_NAME, null);  
  61.             daomaster = new DaoMaster(helper.getWritableDatabase());  
  62.         }  
  63.         return daomaster;  
  64.     }  
  65.   
  66.   
  67.     /** 
  68.      * 3 数据库会话层DaoSession的创建 
  69.      * 完成对数据库的增删改查的操作,这里仅仅是一个接口。 
  70.      * 
  71.      * @return 
  72.      */  
  73.     public DaoSession getDaoSession() {  
  74.         if (daoSession == null) {  
  75.             if (daomaster == null) {  
  76.                 daomaster = getDaoMaster();  
  77.             }  
  78.             daoSession = daomaster.newSession();  
  79.         }  
  80.         return daoSession;  
  81.     }  
  82.   
  83.   
  84.     /** 
  85.      * 关闭数据库的操作,使用完毕数据库,必须执行此操作。 
  86.      */  
  87.     public void CloseConnection() {  
  88.         CloseHelper();  
  89.         ColseDaoSession();  
  90.     }  
  91.   
  92.     /** 
  93.      * 关闭helper 
  94.      */  
  95.     public void CloseHelper() {  
  96.         if (helper != null) {  
  97.             helper.close();  
  98.             helper = null;  
  99.         }  
  100.     }  
  101.   
  102.     /** 
  103.      * 关闭Session会话层 
  104.      */  
  105.     public void ColseDaoSession() {  
  106.         if (daoSession != null) {  
  107.             daoSession.clear();  
  108.             daoSession = null;  
  109.         }  
  110.     }  
  111.   
  112.   
  113.     /** 
  114.      * 打开输出日志的操作 
  115.      */  
  116.     public void SetDebug() {  
  117.         QueryBuilder.LOG_SQL = true;  
  118.         QueryBuilder.LOG_VALUES = true;  
  119.   
  120.     }  
  121.   
  122. }  

调用接口实现:实现数据库的增删改查功能

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.example.admin.myapplication.dbManager;  
  2.   
  3. import android.content.Context;  
  4. import android.database.Cursor;  
  5. import android.util.Log;  
  6.   
  7. import com.example.admin.myapplication.Dao.Student;  
  8. import com.example.admin.myapplication.Dao.StudentDao;  
  9.   
  10. import java.util.List;  
  11.   
  12. import de.greenrobot.dao.query.Query;  
  13. import de.greenrobot.dao.query.QueryBuilder;  
  14. import de.greenrobot.dao.query.WhereCondition;  
  15.   
  16. /** 
  17.  * Created by admin on 2016/5/31. 
  18.  */  
  19. public class CommitUtils {  
  20.     private DaoManager manager;  
  21.   
  22.     public CommitUtils(Context context) {  
  23.         manager = DaoManager.getInstance();  
  24.         manager.init(context);  
  25.     }  
  26.   
  27.     /** 
  28.      * 完成对数据库表的插入操作 
  29.      * 
  30.      * @param student 
  31.      * @return 
  32.      */  
  33.     public boolean insertStudent(Student student) {  
  34.         boolean flag = false;  
  35.         flag = manager.getDaoSession().insert(student) != -1 ? true : false;  
  36.         return flag;  
  37.     }  
  38.   
  39.     /** 
  40.      * 完成对数据库的多次插入 
  41.      * 
  42.      * @param students 
  43.      * @return 
  44.      */  
  45.     public boolean insertMultStudent(final List<Student> students) {  
  46.         boolean flag = false;  
  47.   
  48.         try { // 启动一个线程,执行多次插入  
  49.   
  50.             manager.getDaoSession().runInTx(new Runnable() {  
  51.                 @Override  
  52.                 public void run() {  
  53.                     for (Student student : students) {  
  54.                         manager.getDaoSession().insertOrReplace(student);  
  55.                     }  
  56.   
  57.                 }  
  58.             });  
  59.             flag = true;  
  60.         } catch (Exception e) {  
  61.             e.printStackTrace();  
  62.         }  
  63.         return flag;  
  64.     }  
  65.   
  66.     /** 
  67.      * 更新对student某一条记录的修改 
  68.      * @param student 
  69.      * @return 
  70.      */  
  71.     public boolean updateStudent(Student student) {  
  72.         boolean flag = false;  
  73.         try {  
  74.             manager.getDaoSession().update(student);  
  75.             flag = true;  
  76.         } catch (Exception e)  
  77.   
  78.         {  
  79.             e.printStackTrace();  
  80.         }  
  81.   
  82.   
  83.         return flag;  
  84.     }  
  85.   
  86.   
  87.     /** 
  88.      * 删除一条数据 
  89.      * @param student 
  90.      * @return 
  91.      */  
  92.     public boolean deleteStudent(Student student) {  
  93.   
  94.         boolean flag = false;  
  95.         try {  
  96.             // 删除一条记录  
  97.             manager.getDaoSession().delete(student);  
  98.   
  99.             flag = true;  
  100.         } catch (Exception e) {  
  101.             e.printStackTrace();  
  102.         }  
  103. //        manager.getDaoSession().deleteAll(Student.class);  
  104.   
  105.         return flag;  
  106.   
  107.     }  
  108. //  
  109.   
  110.     /** 
  111.      * 返回多行记录 
  112.      * @return 
  113.      */  
  114.     public List<Student> ListAll() {  
  115.         return manager.getDaoSession().loadAll(Student.class);  
  116.     }  
  117.   
  118.     /** 
  119.      * 按照主键返回单行记录 
  120.      * @param key 
  121.      * @return 
  122.      */  
  123.     public Student ListOneStudent(long key) {  
  124.         return manager.getDaoSession().load(Student.class, key);  
  125.     }  
  126.   
  127.   
  128.     /** 
  129.      * 查询数据 条件查询 
  130.      * @return 
  131.      */  
  132.     public   List<Student> Query1() {  
  133.   
  134.   
  135.       return manager.getDaoSession().queryRaw(Student.class"where name like ? and _id > ?"new String[]{"%张三%""2"});  
  136.   
  137.     }  
  138.   
  139.     /** 
  140.      * 查询数据 对于数据库不熟悉可使用这种方式 
  141.      * @return 
  142.      */  
  143.     public List<Student> Query() {  
  144.   
  145.         QueryBuilder<Student> builder = manager.getDaoSession().queryBuilder(Student.class);  
  146.         List<Student> list = builder.where(StudentDao.Properties.Age.between(2326))  
  147.                 .where(StudentDao.Properties.Address.like("北京")).list();  
  148. //        builder.orderAsc(StudentDao.Properties.Age);  
  149.   
  150.        return list;  
  151.     }  
  152.   
  153. }  

通过上面的两层封装,可以方便的调用GreenDao.


调用代码:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.example.admin.myapplication;  
  2.   
  3. import android.os.Bundle;  
  4.   
  5. import android.support.v7.app.AppCompatActivity;  
  6. import android.util.Log;  
  7. import android.view.View;  
  8.   
  9. import com.example.admin.myapplication.Dao.Student;  
  10. import com.example.admin.myapplication.dbManager.CommitUtils;  
  11.   
  12. import java.util.ArrayList;  
  13. import java.util.List;  
  14.   
  15.   
  16. public class MainActivity extends AppCompatActivity {  
  17.   
  18.     private static final String TAG="MainActivity";  
  19.     private CommitUtils commitUtils;  
  20.     @Override  
  21.     protected void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.activity_main);  
  24.         commitUtils = new CommitUtils(this);  
  25.     }  
  26.   
  27.     //插入数据  
  28.     public void InsertData(View view) {  
  29.   
  30.         Log.i(TAG, "insert Data");  
  31.         Student student = new Student();  
  32.         student.setAddress("北京");  
  33.         student.setAge(23);  
  34.         student.setId(10001l);  
  35.         student.setName("张三");  
  36.         commitUtils.insertStudent(student);  
  37.   
  38.     }  
  39.   
  40.     //插入多条数据  
  41.     public void InsertMulData(View view) {  
  42.         Log.i(TAG, "insert Mut Data");  
  43.         List<Student> list = new ArrayList<>();  
  44.         for (int i = 0; i < 10; i++) {  
  45.             Student student = new Student();  
  46.             student.setAddress("北京");  
  47.             student.setAge(23 + i);  
  48. //            student.setId(10001l + i);  
  49.             student.setName("张三");  
  50.             list.add(student);  
  51.         }  
  52.         commitUtils.insertMultStudent(list);  
  53.     }  
  54.   
  55.   
  56.     /** 
  57.      * //更改数据 
  58.      * @param view 
  59.      */  
  60.     public void updataData(View view) {  
  61.         Log.i(TAG, "data Data");  
  62.         Student student = new Student();  
  63.         student.setAge(1000);  
  64.         student.setName("xiaolei");  
  65.         student.setId(1l);  
  66.         student.setAddress("2432");  
  67.         commitUtils.updateStudent(student);  
  68.     }  
  69.   
  70.   
  71.     public void deleteData(View view) {  
  72.         Student student = new Student();  
  73.         student.setId(2l);  
  74.         commitUtils.deleteStudent(student);  
  75.     }  
  76.   
  77.     public void oneList(View view) {  
  78. //        Student student = commitUtils.ListOneStudent(1);  
  79.         Student student = commitUtils.ListOneStudent(1);  
  80.         Log.i(TAG, student.getName() + "");  
  81.   
  82.     }  
  83.   
  84.     public void mutiList(View view) {  
  85.         List<Student> list = commitUtils.ListAll();  
  86. //        if(list!=null)  
  87.         Log.i(TAG, list.toString());  
  88.     }  
  89.   
  90.    public  void QueryData(View view){  
  91. //       List<Student> query = commitUtils.Query();  
  92.   
  93.   
  94. //       for(int i=0;i<query.size();i++)  
  95. //       {  
  96. //          Log.i(TAG, query.get(i).getAge().toString()+" :"+ query.get(i).getId()) ;  
  97. //       }  
  98.   
  99.        List<Student> students = commitUtils.Query();  
  100.        if(students!=null)  
  101.        for(int i=0;i<students.size();i++) {  
  102.            Log.i(TAG, students.get(i).getAge() + " :" + students.get(i).getId());  
  103.        }  
  104.   
  105.    }  
  106.   
  107. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值