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

  • 在项目的根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: 实现一对多的关系 和 多对多关系的方法( 暂时未研究验证清楚) 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GreenDao是一个高效、轻量级、快速的ORM(对象关系映射)框架,可以方便地将Java对象映射到SQLite数据库中。下面是GreenDao引入和使用步骤: 1. 在build.gradle文件中添加以下依赖: ```groovy dependencies { implementation 'org.greenrobot:greendao:3.3.0' } ``` 2. 在app/build.gradle文件中添加以下配置: ```groovy android { defaultConfig { //... javaCompileOptions { annotationProcessorOptions { arguments = ["schemaVersion": "1", "daoPackage": "com.example.myapp.db"] } } } } greendao { schemaVersion 1 daoPackage 'com.example.myapp.db' targetGenDir 'src/main/java' } ``` 这些配置将告诉GreenDao在编译时生成DAO(数据访问对象)类。schemaVersion是数据库的版本号,daoPackage是生成DAO类的包名,targetGenDir是DAO类的生成目录。 3. 创建实体类,例如: ```java @Entity public class User { @Id(autoincrement = true) private Long id; private String name; private int age; // getters and setters } ``` @Entity注解表示这是一个实体类,@Id注解表示这是主键,autoincrement = true表示主键自增。 4. 在app/src/main/java目录下创建一个名为“greenDao”的包,并在该包下创建一个名为“DaoMasterOpenHelper”的类。该类继承自DaoMaster.OpenHelper,用于创建和升级数据库。例如: ```java public class DaoMasterOpenHelper extends DaoMaster.OpenHelper { public DaoMasterOpenHelper(Context context, String name) { super(context, name); } @Override public void onCreate(Database db) { super.onCreate(db); } @Override public void onUpgrade(Database db, int oldVersion, int newVersion) { // 数据库升级逻辑 } } ``` 5. 初始化GreenDao,在Application类的onCreate()方法中添加以下代码: ```java public class MyApp extends Application { private DaoSession daoSession; @Override public void onCreate() { super.onCreate(); DaoMasterOpenHelper helper = new DaoMasterOpenHelper(this, "mydb"); Database db = helper.getWritableDb(); daoSession = new DaoMaster(db).newSession(); } public DaoSession getDaoSession() { return daoSession; } } ``` 这里创建了一个DaoMasterOpenHelper实例,并通过它获取可写的数据库,然后创建一个DaoSession实例。 6. 使用GreenDao,例如: ```java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DaoSession daoSession = ((MyApp) getApplication()).getDaoSession(); User user = new User(); user.setName("Tom"); user.setAge(18); daoSession.getUserDao().insert(user); List<User> userList = daoSession.getUserDao().queryBuilder() .where(UserDao.Properties.Age.gt(10)) .orderAsc(UserDao.Properties.Age) .list(); } } ``` 这里通过getApplication()方法获取MyApp实例,然后通过getDaoSession()方法获取DaoSession实例。接着创建了一个User实例并插入到数据库中。最后使用查询构建器查询年龄大于10的所有用户,并按年龄升序排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值