美文网首页androidAndroid 数据库
数据库GreenDao的使用、升级、以及相关常用注释说明

数据库GreenDao的使用、升级、以及相关常用注释说明

作者: Amy_LuLu__ | 来源:发表于2018-04-04 10:44 被阅读127次

    文章来源:GreenDao:3.2.0用法

    目录

    一、使用GreenDao的流程

    1. 添加GreenDao依赖
    2. 配置greendao的generator生成文件
    3. 使用GreenDao生成bean类
      3.1 创建实体类
      3.2 生成dao文件
    4. 创建GreenDaoManager来进行统一管理,并初始化
      4.1 创建GreenDaoManager
      4.2 在Application中进行初始化GreenDao
    5. 使用GreenDao来进行数据操作CRUD

    二、GreenDao升级
    三、GreenDao注释

    一、使用GreenDao的流程

    1.添加GreenDao依赖

    GreenDao github地址

    // In your root build.gradle file:
    buildscript {
        repositories {
            jcenter()
            mavenCentral() // add repository
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.3.3'
            classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
        }
    }
     
    // In your app projects build.gradle file:
    apply plugin: 'com.android.application'
    apply plugin: 'org.greenrobot.greendao' // apply plugin
     
    dependencies {
        compile 'org.greenrobot:greendao:3.2.2' // add library
    }
    

    2. 配置greendao的generator生成文件

    // In your app projects build.gradle file:
    android {
        //...
        greendao {
            schemaVersion 1 //数据库版本号
            daoPackage 'com.db.greendao.gen' //自动生成的工具类的包名,一般为app包名+生成文件的文件夹名
            targetGenDir 'src/main/java' //生成文件路径  
        }
        //...
    }
    

    3. 使用GreenDao生成bean类

    3.1 创建实体类
    @Entity
    public class Person {
        @Id
        private Long id;
        private String name;
        private int age;
        private String sex;
    }
    
    3.2 生成dao文件

    按ctrl+F9,或者在工具栏build下面的Make Project对项目进行重新构建。
    生成文件。

    而Person类变样了
    变成了

    package gap.com.mydemo;
    
    import org.greenrobot.greendao.annotation.Entity;
    import org.greenrobot.greendao.annotation.Id;
    import org.greenrobot.greendao.annotation.Generated;
    
    /**
     * @version $version$
     * @package $package$
     * @description $desc$
     * @user gzl
     * @date $date$
     * @time $time$
     * @email 973780371@qq.com
     * @phone 18067970513
     */
    @Entity
    public class Person {
        @Id
        private Long id;
        private String name;
        private int age;
        private String sex;
        @Generated(hash = 2139037974)
        public Person(Long id, String name, int age, String sex) {
            this.id = id;
            this.name = name;
            this.age = age;
            this.sex = sex;
        }
        @Generated(hash = 1024547259)
        public Person() {
        }
        public Long getId() {
            return this.id;
        }
        public void setId(Long id) {
            this.id = id;
        }
        public String getName() {
            return this.name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return this.age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getSex() {
            return this.sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
    }
    
    

    targetGenDir 'src/main/java' //生成文件路径 就是用于指定经过处理的Person类放置的位置。

    4. 创建GreenDaoManager来进行统一管理,并初始化

    4.1 创建GreenDaoManager

    初始化需要实例化GreenDao所需要的几个关键对象,DaoMaster,DaoSession。
    创建GreenDaoManager类,在构造函数中进行初始化**

    public class GreenDaoManager {
        private DaoMaster mDaoMaster;
        private DaoSession mDaoSession;
        private static volatile GreenDaoManager mInstance = null;
    
        private GreenDaoManager(Context context) {
            if (mInstance == null) {
                DaoMaster.DevOpenHelper devOpenHelper = new
                        DaoMaster.DevOpenHelper(context, "message.db"); //数据库名
                mDaoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());
                mDaoSession = mDaoMaster.newSession();
            }
        }
    
        public static GreenDaoManager getInstance() {
            return mInstance;
        }
    
        public static void initGreenDaoManager(Context context) {
            if (mInstance == null) {
                synchronized (GreenDaoManager.class) {
                    if (mInstance == null) {
                        mInstance = new GreenDaoManager(context);
                    }
                }
            }
        }
    
        public DaoMaster getMaster() {
            return mDaoMaster;
        }
    
        public DaoSession getSession() {
            return mDaoSession;
        }
    
        public DaoSession getNewSession() {
            mDaoSession = mDaoMaster.newSession();
            return mDaoSession;
        }
    }
    
    4.2 在Application中进行初始化GreenDao
    GreenDaoManager.initGreenDaoManager(this);
    

    5. 使用GreenDao来进行数据操作CRUD

    首先封装一个方法,方便后面的CRUD操作。

        private PersonDao getPersonDao() {
            return GreenDaoManager.getInstance().getSession().getPersonDao();
        }
    

    CRUD方法参考下面:

    public class MainActivity extends AppCompatActivity {
        //@Transient,该注解表示这个属性将不会作为数据表中的一个字段
        //@NotNull表示该字段不可以为空,@Unique表示该字段唯一
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
    //        updatadata();
    //        insertdata();
    //        querydata();
              //删除数据
    //        getUserDao().deleteByKey(2l);//long类型
    //        querydata();
    //        querydataBy();
    
            getuserById();
    
    
        }
    
        private void getuserById() {
            User user =getUserDao().load(1l);
            Log.i("tag", "结果:" + user.getId() + "," + user.getName() + "," + user.getAge() + "," + user.getIsBoy() + ";");
    
    
        }
    
        private void insertdata() {
            //插入数据
            User insertData = new User(null, "插入数据", 24, false);
            getUserDao().insert(insertData);
        }
    
        private void updatadata() {
            //更改数据
            List<User> userss = getUserDao().loadAll();
            User user = new User(userss.get(0).getId(), "更改后的数据用户", 22, true);
            getUserDao().update(user);
    
        }
    
        private void querydata() {
            //查询数据详细
            List<User> users = getUserDao().loadAll();
            Log.i("tag", "当前数量:" + users.size());
            for (int i = 0; i < users.size(); i++) {
                Log.i("tag", "结果:" + users.get(i).getId() + "," + users.get(i).getName() + "," + users.get(i).getAge() + "," + users.get(i).getIsBoy() + ";");
            }
    
        }
    
        private void querydataBy() {////查询条件
            Query<User> nQuery = getUserDao().queryBuilder()
    //                .where(UserDao.Properties.Name.eq("user1"))//.where(UserDao.Properties.Id.notEq(999))
                    .orderAsc(UserDao.Properties.Age)//.limit(5)//orderDesc
                    .build();
            List<User> users = nQuery.list();
            Log.i("tag", "当前数量:" + users.size());
            for (int i = 0; i < users.size(); i++) {
                Log.i("tag", "结果:" + users.get(i).getId() + "," + users.get(i).getName() + "," + users.get(i).getAge() + "," + users.get(i).getIsBoy() + ";");
            }
    
    //        QueryBuilder qb = userDao.queryBuilder();
    //        qb.where(Properties.FirstName.eq("Joe"),
    //                qb.or(Properties.YearOfBirth.gt(1970),
    //                        qb.and(Properties.YearOfBirth.eq(1970), Properties.MonthOfBirth.ge(10))));
    //        List youngJoes = qb.list();
        }
    
    
        /**
         * 根据查询条件,返回数据列表
         * @param where        条件
         * @param params       参数
         * @return             数据列表
         */
        public List<User> queryN(String where, String... params){
            return getUserDao().queryRaw(where, params);
        }
    
        /**
         * 根据用户信息,插件或修改信息
         * @param user              用户信息
         * @return 插件或修改的用户id
         */
        public long saveN(User user){
            return getUserDao().insertOrReplace(user);
        }
    
        /**
         * 批量插入或修改用户信息
         * @param list      用户信息列表
         */
        public void saveNLists(final List<User> list){
            if(list == null || list.isEmpty()){
                return;
            }
            getUserDao().getSession().runInTx(new Runnable() {
                @Override
                public void run() {
                    for(int i=0; i<list.size(); i++){
                        User user = list.get(i);
                        getUserDao().insertOrReplace(user);
                    }
                }
            });
    
        }
    
        /**
         * 删除所有数据
         */
        public void deleteAllNote(){
            getUserDao().deleteAll();
        }
    
        /**
         * 根据用户类,删除信息
         * @param user    用户信息类
         */
        public void deleteNote(User user){
            getUserDao().delete(user);
        }
        private UserDao getUserDao() {
            return GreenDaoManager.getInstance().getSession().getUserDao();
        }
    
    }
    

    二、GreenDao升级

    第一步:改版本号

    greendao{
        schemaVersion 5
        daoPackage 'xxxxxxxxxx'
        targetGenDir 'src/main/java'
    }
    

    第二步:修改实体类为自己需要的类型
    重现编译项目运行即可。
    这样修改,之前的数据库会被删除,重新创建。

    三、GreenDao注释

    常用注解

    @Entity
    public class User {
        @Id(autoincrement = true)
        private Long id;
      
        @Property(nameInDb = "USERNAME")
        private String name;
      
        @NotNull
        private int repos;
      
        @Transient
        private int tempUsageCount;
      
        ...
    }
    

    @Entity 用于标识这是一个需要Greendao帮我们生成代码的bean
    @Id 标明主键,括号里可以指定是否自增
    @Property 用于设置属性在数据库中的列名(默认不写就是保持一致)
    @NotNull 非空
    @Transient 标识这个字段是自定义的不会创建到数据库表里
    @Unique 添加唯一约束

    关系注解

    @Entity
    public class Order {
        @Id private Long id;
      
        private long customerId;
      
        @ToOne(joinProperty = "customerId")
        private Customer customer;
    }
      
    @Entity
    public class Customer {
        @Id private Long id;
    }
    

    @ToOne 是将自己的一个属性与另一个表建立关联

    @Entity
    public class User {
        @Id private Long id;
      
        @ToMany(referencedJoinProperty = "ownerId")
        private List<Site> ownedSites;
    }
      
    @Entity
    public class Site {
        @Id private Long id;
        private long ownerId;
    }
    
    // ----------------------------
     
    @Entity
    public class User {
        @Id private Long id;
        @Unique private String authorTag;
      
        @ToMany(joinProperties = {
                @JoinProperty(name = "authorTag", referencedName = "ownerTag")
        })
        private List<Site> ownedSites;
    }
      
    @Entity
    public class Site {
        @Id private Long id;
        @NotNull private String ownerTag;
    }
    

    @ToMany的属性referencedJoinProperty,类似于外键约束。
    @JoinProperty 对于更复杂的关系,可以使用这个注解标明目标属性的源属性。

    相关文章

      网友评论

        本文标题:数据库GreenDao的使用、升级、以及相关常用注释说明

        本文链接:https://www.haomeiwen.com/subject/iznhhftx.html