GreenDao使用

Posted xiaoleiacm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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上查找最新的版本)

compile 'org.greenrobot:greendao:2.2.0'

2 建立一个java-gen


在APP的Gradle中的android下加入:

 sourceSets
        main
            java.srcDirs=['src/main/java','src/main.java-gen']
        
    


3 新建一个java Library

 

命名为:

Library Name:greendaogenerator

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


生成如图结构


4  在greendaogenerator的Gradle中添加

compile 'org.greenrobot:greendao-generator:2.2.0'

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

ExampleDaoGenerator类是为了生成数据库表而建立的一个节点类,它需要完成数据库版本的建立,节点的建立,以及设置GreenDao核心代码的路径。
 
package com.example;

import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Schema;

public class ExampleDaoGenerator 
    public static void main(String[] args) 
        //生成实体类entity 即对应的表
        Schema schema = new Schema(1, "com.student.entity");
        //添加节点
        addStudent(schema);

        schema.setDefaultJavaPackageDao("com.student.dao");// 设置数据的会话层


        //将生成的内容放在指定的路径下C:\\Users\\admin\\Desktop\\shujuku\\MyApplication\\app\\src\\main\\java-gen
        try 
            new DaoGenerator().generateAll(schema, "/Users/admin/Desktop/shujuku/MyApplication/app/src/main/java-gen");
         catch (Exception e) 
            e.printStackTrace();
        

    

    创建数据库的表
    private static void addStudent(Schema schema) 

        Entity entity = schema.addEntity("Student"); //创建数据库的表


        /**
         * 设置字符串获其他类型为主键
         * entity.addStringProperty("身份证号").primaryKey();
         */
        //当前表中的列

        entity.addIdProperty();// 主键
        entity.addStringProperty("name");
        entity.addStringProperty("address");
        entity.addIntProperty("age");

    




生成GreenDao的CoreCode

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

 
 

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

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

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

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

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

GreenDao数据库的再封装:

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

数据库初始化:

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

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

package com.example.admin.myapplication.dbManager;

import android.content.Context;

import com.example.admin.myapplication.Dao.DaoMaster;
import com.example.admin.myapplication.Dao.DaoSession;

import de.greenrobot.dao.query.QueryBuilder;

/**
 * 1 创建数据库
 * 2 创建数据库表
 * 3 创建数据库的增删查改
 * 4 对数据库的升级
 * Created by admin on 2016/5/31.
 */
public class DaoManager 
    private static final String TAG = DaoManager.class.getSimpleName();
    private static final String DB_NAME = "mydb.sqlite";  //声明数据库
    private volatile static DaoManager manager; //多线程名称
    private static DaoMaster.DevOpenHelper helper;

    private static DaoMaster daomaster;
    private static DaoSession daoSession;

    private Context context;

    public void init(Context context) 
        this.context = context;
    

    /**
     * 1 数据库类的创建
     * 线程安全创建DaoManager,使用单例模式获得操作数据库的对象
     *
     * @return note:为保证数据库的有效性,采用单利模式进行访问
     */
    public static DaoManager getInstance() 

            DaoManager instance = null;
            if (manager == null) 
                synchronized (DaoManager.class) 
                    if (instance == null) 
                        instance = new DaoManager();
                        manager = instance;
                    
                
            
            return instance;
    

    /**
     * 2 Master类的创建
     * 得到DaoMaster
     *
     * @return note:系统帮助用户监测是否有数据库,如果没有,则创建数据库
     */
    public DaoMaster getDaoMaster() 
        if (daomaster == null) 
            DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, DB_NAME, null);
            daomaster = new DaoMaster(helper.getWritableDatabase());
        
        return daomaster;
    


    /**
     * 3 数据库会话层DaoSession的创建
     * 完成对数据库的增删改查的操作,这里仅仅是一个接口。
     *
     * @return
     */
    public DaoSession getDaoSession() 
        if (daoSession == null) 
            if (daomaster == null) 
                daomaster = getDaoMaster();
            
            daoSession = daomaster.newSession();
        
        return daoSession;
    


    /**
     * 关闭数据库的操作,使用完毕数据库,必须执行此操作。
     */
    public void CloseConnection() 
        CloseHelper();
        ColseDaoSession();
    

    /**
     * 关闭helper
     */
    public void CloseHelper() 
        if (helper != null) 
            helper.close();
            helper = null;
        
    

    /**
     * 关闭Session会话层
     */
    public void ColseDaoSession() 
        if (daoSession != null) 
            daoSession.clear();
            daoSession = null;
        
    


    /**
     * 打开输出日志的操作
     */
    public void SetDebug() 
        QueryBuilder.LOG_SQL = true;
        QueryBuilder.LOG_VALUES = true;

    



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

package com.example.admin.myapplication.dbManager;

import android.content.Context;
import android.database.Cursor;
import android.util.Log;

import com.example.admin.myapplication.Dao.Student;
import com.example.admin.myapplication.Dao.StudentDao;

import java.util.List;

import de.greenrobot.dao.query.Query;
import de.greenrobot.dao.query.QueryBuilder;
import de.greenrobot.dao.query.WhereCondition;

/**
 * Created by admin on 2016/5/31.
 */
public class CommitUtils 
    private DaoManager manager;

    public CommitUtils(Context context) 
        manager = DaoManager.getInstance();
        manager.init(context);
    

    /**
     * 完成对数据库表的插入操作
     *
     * @param student
     * @return
     */
    public boolean insertStudent(Student student) 
        boolean flag = false;
        flag = manager.getDaoSession().insert(student) != -1 ? true : false;
        return flag;
    

    /**
     * 完成对数据库的多次插入
     *
     * @param students
     * @return
     */
    public boolean insertMultStudent(final List<Student> students) 
        boolean flag = false;

        try  // 启动一个线程,执行多次插入

            manager.getDaoSession().runInTx(new Runnable() 
                @Override
                public void run() 
                    for (Student student : students) 
                        manager.getDaoSession().insertOrReplace(student);
                    

                
            );
            flag = true;
         catch (Exception e) 
            e.printStackTrace();
        
        return flag;
    

    /**
     * 更新对student某一条记录的修改
     * @param student
     * @return
     */
    public boolean updateStudent(Student student) 
        boolean flag = false;
        try 
            manager.getDaoSession().update(student);
            flag = true;
         catch (Exception e)

        
            e.printStackTrace();
        


        return flag;
    


    /**
     * 删除一条数据
     * @param student
     * @return
     */
    public boolean deleteStudent(Student student) 

        boolean flag = false;
        try 
            // 删除一条记录
            manager.getDaoSession().delete(student);

            flag = true;
         catch (Exception e) 
            e.printStackTrace();
        
//        manager.getDaoSession().deleteAll(Student.class);

        return flag;

    
//

    /**
     * 返回多行记录
     * @return
     */
    public List<Student> ListAll() 
        return manager.getDaoSession().loadAll(Student.class);
    

    /**
     * 按照主键返回单行记录
     * @param key
     * @return
     */
    public Student ListOneStudent(long key) 
        return manager.getDaoSession().load(Student.class, key);
    


    /**
     * 查询数据 条件查询
     * @return
     */
    public   List<Student> Query1() 


      return manager.getDaoSession().queryRaw(Student.class, "where name like ? and _id > ?", new String[]"%张三%", "2");

    

    /**
     * 查询数据 对于数据库不熟悉可使用这种方式
     * @return
     */
    public List<Student> Query() 

        QueryBuilder<Student> builder = manager.getDaoSession().queryBuilder(Student.class);
        List<Student> list = builder.where(StudentDao.Properties.Age.between(23, 26))
                .where(StudentDao.Properties.Address.like("北京")).list();
//        builder.orderAsc(StudentDao.Properties.Age);

       return list;
    



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


调用代码:

package com.example.admin.myapplication;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

import com.example.admin.myapplication.Dao.Student;
import com.example.admin.myapplication.dbManager.CommitUtils;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends AppCompatActivity 

    private static final String TAG="MainActivity";
    private CommitUtils commitUtils;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        commitUtils = new CommitUtils(this);
    

    //插入数据
    public void InsertData(View view) 

        Log.i(TAG, "insert Data");
        Student student = new Student();
        student.setAddress("北京");
        student.setAge(23);
        student.setId(10001l);
        student.setName("张三");
        commitUtils.insertStudent(student);

    

    //插入多条数据
    public void InsertMulData(View view) 
        Log.i(TAG, "insert Mut Data");
        List<Student> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) 
            Student student = new Student();
            student.setAddress("北京");
            student.setAge(23 + i);
//            student.setId(10001l + i);
            student.setName("张三");
            list.add(student);
        
        commitUtils.insertMultStudent(list);
    


    /**
     * //更改数据
     * @param view
     */
    public void updataData(View view) 
        Log.i(TAG, "data Data");
        Student student = new Student();
        student.setAge(1000);
        student.setName("xiaolei");
        student.setId(1l);
        student.setAddress("2432");
        commitUtils.updateStudent(student);
    


    public void deleteData(View view) 
        Student student = new Student();
        student.setId(2l);
        commitUtils.deleteStudent(student);
    

    public void oneList(View view) 
//        Student student = commitUtils.ListOneStudent(1);
        Student student = commitUtils.ListOneStudent(1);
        Log.i(TAG, student.getName() + "");

    

    public void mutiList(View view) 
        List<Student> list = commitUtils.ListAll();
//        if(list!=null)
        Log.i(TAG, list.toString());
    

   public  void QueryData(View view)
//       List<Student> query = commitUtils.Query();


//       for(int i=0;i<query.size();i++)
//       
//          Log.i(TAG, query.get(i).getAge().toString()+" :"+ query.get(i).getId()) ;
//       

       List<Student> students = commitUtils.Query();
       if(students!=null)
       for(int i=0;i<students.size();i++) 
           Log.i(TAG, students.get(i).getAge() + " :" + students.get(i).getId());
       

   





以上是关于GreenDao使用的主要内容,如果未能解决你的问题,请参考以下文章

GreenDao使用

GreenDao操作本地db文件(使用greendao 新版3.2.2 )

android greenDao使用

记一次使用GreenDao的小“坑”

记一次使用GreenDao的小“坑”

记一次使用GreenDao的小“坑”