项目如何引入GreenDao3.2的记录

本文详细介绍了如何在Android项目中使用GreenDao进行数据库操作,包括配置步骤、实体类定义、数据库初始化、基本CRUD操作及复杂查询等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 在项目的根build.gradle脚本文件中加入 mavenCentral()仓库  和 编译插件
  • classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
    
    
2. 在app 模块的build.gradle中加入以下内容

apply plugin: 'org.greenrobot.greendao'
greendao {
    schemaVersion 1
    daoPackage 'kap.com.smarthome.android.data.dao'//这个是生成代码保存的包名  (根据自己的实际情况而定)
    targetGenDir 'src/main/java/'//保存到java代码路径
}

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



3. 新建一个Bean 类  格式如下 



@Entity
public class MyTestBean {
    @Id(autoincrement = true)
    private Long id;

    private String name;
    private String sex;
    private int age;
    private int salary;}
只需要定义这个实体类的字段 , 其中注解 @Entity 代表的这是一个实体类,数据库的插件会在构建项目的时候生成出来数据库的一个结构 

会生成DaoMaster 和 DaoSession
DaoMaster : 
  • 是GreenDao的入口也是greenDao顶级对象,对于一个指定的表单持有数据库对象(SQLite数据库)并且能够管理DAO类
  • 能够创建表和删除表
  • 其内部类OpenHelper 与DevOpenHelper是创建SQlite数据库的SQLiteOpenHelper的具体实现
DaoSession :


  • 对于一个指定的表单可以管理所有的 Dao 对象。
  • 也能够对实体类执行 insert ,load,update,refresh.delete操作。
  • DaoSession也能跟踪 identity scope:即session查询后的实体会存在缓存中,并给该实体生成一个flag来追踪该实体,
  • 下次再次查询时会直接从缓存中取出来而不是从数据库中取出来

4. 创建一个单例类初始化数据库,再在Application中调用初始化类得到实例
数据库的管理类
public class DBManageUtils {

    private  static   DBManageUtils  mDBManage = null;
    private  DaoSession mDaoSession;


    /**
     * 采用单例模式,放到Application中进行初始,保证全局唯一性
     * @param context
     */
    private DBManageUtils(Context context){
        DaoMaster.DevOpenHelper  helper = new DaoMaster.DevOpenHelper(context, DBContstants.DB_NAME);
        Database db = helper.getWritableDb();
        mDaoSession = new DaoMaster(db).newSession();
    }

    public  synchronized  static  DBManageUtils  getDbInstance(Context context){
        if(mDBManage == null){
            mDBManage = new DBManageUtils(context);
        }
        return mDBManage;
    }


    /**
     * 得到数据库的session
     * @return
     */
    public DaoSession  getmDaoSession(){
        if(mDaoSession != null) {
            return mDaoSession;
        }
        return  null;
    }

}
MyApplication对数据库提供统一的接口:
 @Override
    public void onCreate() {
        super.onCreate();
        //初始化数据库
        initDb();
    }

    //数据库管理类
    private DBManageUtils mKotiDbManage;

    /**
     * 初始化数据库DB,实例化一个数据库的会话Sesssion, (采用的是GreenDao框架)
     */
    private void initDb(){
        mKotiDbManage =  DBManageUtils.getDbInstance(this);
    }

    //得到数据库管理类的方法
    public  DBManageUtils getmKotiDbManage(){
        return  mKotiDbManage;
    }


5. 在外界访问数据库,对其中的表数据进行增删改查











/**
     * 对位置 为position的的数据进行修改
     * @param position
     */
    public void updateUser(Long position , MyTestBeanDao myTestBeanDao){
        //查询id是1位置的数据
        TestBean user = myTestBeanDao.load(5l);
        //对其进行修改
        user.setName("简国堂");
        myTestBeanDao.update(user);

        //这个方法也可以修改
        myTestBeanDao.insertOrReplace(user);

    }

    /**
     * 查询所有
     * @param myTestBeanDao
     */

    public void getAll ( MyTestBeanDao myTestBeanDao){

        List<TestBean>  lists =  myTestBeanDao.queryBuilder().list();
        for (TestBean myBean : lists) {
            Log.e("CHRIS", "getAll: lists  = " + myBean.toString());
        }

        //懒加载模式
        LazyList<TestBean> lazyList =  myTestBeanDao.queryBuilder().listLazy();
        //myTestBeanDao.queryBuilder().

        for (TestBean myBean : lazyList) {
            Log.e("CHRIS", "getAll: lazyList  = " + myBean.toString());
        }


        //用另一整个遍历查询的方法
        Iterator  myIterator = myTestBeanDao.queryBuilder().listIterator();
        while(myIterator.hasNext()){
            TestBean bean  = (TestBean) myIterator.next();
            Log.i("CHRIS", "getAll: myIterator  = " + bean.toString());
        }

        lazyList.close();

    }

    public void delete(MyTestBeanDao myTestBeanDao){
        //删除
        myTestBeanDao.delete(new TestBean());
        myTestBeanDao.deleteByKey(1L);

    }


    /**
     * 条件查询  等于 Eq
     */
    public void queryEq(MyTestBeanDao myTestBeanDao){

        List beans =   myTestBeanDao.queryBuilder().where(MyTestBeanDao.Properties.Id.eq(1)).list();

        Log.i("CHRIS", "getAll: queryEq  = " + beans.toString());
    }

    /**
     * 条件查询  不等于 NotEq
     */
    public void queryNotEq(MyTestBeanDao myTestBeanDao){

        List beans =   myTestBeanDao.queryBuilder().where(MyTestBeanDao.Properties.Id.notEq(1)).list();

        Log.i("CHRIS", "getAll: queryNotEq  = " + beans.toString());
    }


    /**
     * 条件查询  匹配查找 Like
     */
    public void queryLike(MyTestBeanDao myTestBeanDao){

        List beans =   myTestBeanDao.queryBuilder().where(MyTestBeanDao.Properties.Name.like("jiang")).list();

        Log.i("CHRIS", "getAll: queryLike  = " + beans.toString());
    }

    /**
     * 条件查询  区间查找 Between
     */
    public void queryBetween(MyTestBeanDao myTestBeanDao){

        List beans =   myTestBeanDao.queryBuilder().where(MyTestBeanDao.Properties.Age.between(10,20)).list();

        Log.i("CHRIS", "getAll: queryBetween  = " + beans.toString());

    }


    /**
     * 条件查询  大于查找  Gt
     */
    public void queryGt(MyTestBeanDao myTestBeanDao){

        List beans =   myTestBeanDao.queryBuilder().where(MyTestBeanDao.Properties.Age.gt(20)).list();

        Log.i("CHRIS", "getAll: queryGt  = " + beans.toString());

    }

    /**
     * 条件查询  大于等于查找 Ge
     */
    public void queryGe(MyTestBeanDao myTestBeanDao){

        List beans =   myTestBeanDao.queryBuilder().where(MyTestBeanDao.Properties.Age.ge(20)).list();

        Log.i("CHRIS", "getAll: queryGe  = " + beans.toString());

    }

    /**
     * 条件查询  小于查找  Lt
     */
    public void queryLt(MyTestBeanDao myTestBeanDao){

        List beans =   myTestBeanDao.queryBuilder().where(MyTestBeanDao.Properties.Age.lt(20)).list();

        Log.i("CHRIS", "getAll: queryLt  = " + beans.toString());
    }

    /**
     * 条件查询  小于等于查找 Le
     */
    public void queryLe(MyTestBeanDao myTestBeanDao){

        List beans =   myTestBeanDao.queryBuilder().where(MyTestBeanDao.Properties.Age.le(20)).list();

        Log.i("CHRIS", "getAll: queryLe  = " + beans.toString());
    }


    /**
     * 条件查询  排序查询
     * 升序  OrderAsc
     * 升序  OrderDsc
     */
    public void queryOrderAsc(MyTestBeanDao myTestBeanDao){

        List beans = myTestBeanDao.queryBuilder().where(MyTestBeanDao.Properties.Age.le(20)).
                orderAsc(MyTestBeanDao.Properties.Id).list();

        Log.i("CHRIS", "getAll: queryLe  = " + beans.toString());
    }

    /**
     * 原生方法查询
     * 升序  OrderAsc
     * 升序  OrderDsc
     */
    public void querySQL(MyTestBeanDao myTestBeanDao){

        Query<TestBean> query = myTestBeanDao.queryBuilder().where(
                new WhereCondition.StringCondition("_ID IN " +
                        "(SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)")
        ).build();

        Log.i("CHRIS", "getAll: queryLe  = " + query.toString());
    }


    public void queryThread(MyTestBeanDao myTestBeanDao){
public class TestBean1 {
    @Id
    private Long id;

    private String name;

    private int  age;

final Query query = myTestBeanDao.queryBuilder().build(); new Thread(){ @Override public void run() { super.run(); // org.greenrobot.greendao.DaoException: // Method may be called only in owner thread, // use forCurrentThread to get an instance for this thread Query創建和調用需要在同一個線程中 List data = query.forCurrentThread().list(); Log.e("CHRIS", "run: == data == " + data); } }.start(); }

6.问题1: 如果一个表需要和另外一个表关联: 在建立实体类的时候需要建立连接关系()

eg: 1 我有两个Bean TestBean1 和TestBean2 
      2 TestBean2 需要关联查询TestBean1,在编写实体类如下(红色字体的是表示实现连接关系  一对一关系  @toOne
public class TestBean1 {
    @Id
    private Long id;

    private String name;

    private int  age;


@Entity
public class TestBean2 {
    @Id
    private Long  id;

    private String Address;

    private String salary;

    private Long  testBeanId;

    @ToOne(joinProperty = "testBeanId")
    private TestBean1 testBean1;

7.问题2: 实现一对多的关系 和 多对多关系的方法(暂时未研究验证清楚) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值