关闭

GreenDao使用

标签: GreenDao数据库
4288人阅读 评论(2) 收藏 举报
分类:

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());
       }

   }

}



1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    嘿嘿~
    Everlasting Twinkling~~~
    个人资料
    • 访问:243644次
    • 积分:5473
    • 等级:
    • 排名:第5055名
    • 原创:310篇
    • 转载:23篇
    • 译文:0篇
    • 评论:37条