GreenDao的简单使用

作者: 程序员丶星霖 | 来源:发表于2017-07-28 09:17 被阅读1430次

    GreenDao的简单使用

    一、简介

    greenDao是一款开源的Android ORM,使得SQLite的二次开发更简单,减轻了开发人员处理低级数据库需求,同时节省开发时间。

    greenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案。

    GreenDao.png

    二、greenDao的优点

    • 是一个精简的库
    • 性能最大化,据说是Android最快的关系型数据库
    • 内存开销最小化
    • 易于使用的APIs
    • 对Android进行高度优化
    • 支持数据库加密

    三、greenDao 3.0的使用

    greenDao 3.0 采用注解的方式来定义实体类,通过gradle插件生成相应的代码。

    • 3.1 在AS中导入相关的包
    /*GreenDao*/
        compile'org.greenrobot:greendao:3.2.0'
        compile'org.greenrobot:greendao-generator:3.2.0'
    
    • 3.2 在build.gradle中进行配置

    在根build.gradle文件中添加

    // In your root build.gradle file:
    buildscript {
        repositories {
            jcenter()
            mavenCentral() // add repository
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.3.1'
            classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
        }
    }
    

    在app中的build.gradle中添加

    // 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
    }
    
    greendao {
        schemaVersion 1
        daoPackage 'com.tengxin.chelingwang.gen'
        targetGenDir 'src/main/java'
    }
    
    • schemaVersion:指定数据库schema版本号,升级或迁移等操作会用到;
    • daoPackage:dao的包名,包名默认是entity所在的包;
    • targetGenDir:生成数据库文件的目录
    • generateTests:设置是否自动生成单元测试
    • targetGenDirTest:生成的单元测试的根目录

    四、上代码

    • 4.1 创建一个Bean类
    基础注解
    Entity
    public class User {
        @Id
        private String id;
        private String phone;
        private String phone_full;
        private String email;
        private String email_full;
        private String money;
        private String money_text;
        private String trade;
        private String username;
        private String realname;
        private String nickname;
        private String show_name;
        private String gender;
        private String avatar;
        private String deposit;
        private String deposit_text;
        private String birthday;
        private String good;
        private String bad;
        private String is_seller;
        private String is_auth;
        private String auth_waiting;
        private String pay_pwd_set;
        private String last_login;
        private String token;
        private String chat_token;
    }
    
    实体注解:
    @Entity(
            // 如果你有超过一个的数据库结构,可以通过这个字段来区分
            // 该实体属于哪个结构
            schema = "myschema",
    
            //  实体是否激活的标志,激活的实体有更新,删除和刷新的方法
            active = true,
    
            // 确定数据库中表的名称
            // 表名称默认是实体类的名称
            nameInDb = "AWESOME_USERS",
    
            // Define indexes spanning multiple columns here.
            indexes = {
                    @Index(value = "name DESC", unique = true)
            },
    
            // DAO是否应该创建数据库表的标志(默认为true)
            // 如果你有多对一的表,将这个字段设置为false
            // 或者你已经在GreenDAO之外创建了表,也将其置为false
            createInDb = false
    )
    public class User {
      ...
    }
    
    1. 实体@Entity注解
    • schema:告知GreenDao当前实体属于哪个schema;
    • active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法;
    • nameInDb:在数据库中的别名,默认使用的是实体的类名;
    • indexes:定义索引,可以跨越多个列;
    • createInDb:标记创建数据库表;
    1. 基础属性注解
    • @Id:主键Long型,可以通过@Id(autonicrement=true)设置自增长;
    • @Property:设置一个非默认关系映射所对应的列名,默认是使用字段名;
    • @NotNul:设置数据库表当前列不能为空;
    • @Transient:添加标记之后不会生成数据库表的列。
    1. 索引注解
    • @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束;
    • @Unique:向数据库列添加了一个唯一的约束。
    1. 关系注解
    • @ToOne:定义与另一个实体(一个实体对象)的关系。
    • @ToMany:定义与多个实体对象的关系。
    • @OrderBy:排序。

    五、编译项目

    编译项目,User实体类会自动编译,生成get、set方法并且会在设置的目录下生成三个文件DaoMaster、DaoSession、UserDao。

    六、编写帮助类

    public class GreenDaoManager {
        private static GreenDaoManager mInstance;
        private static DaoSession daoSession;
        private static DaoMaster daoMaster;
        private static SQLiteDatabase db;
    
        private GreenDaoManager(Context context) {
            //通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper
            //注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
            DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(context, "contacts-db",null);
            //注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
            db = devOpenHelper.getWritableDatabase();
    
            daoMaster = new DaoMaster(db);
            daoSession = daoMaster.newSession();
        }
    
        public static GreenDaoManager getmInstance(Context context){
            if (mInstance == null){
                synchronized (GreenDaoManager.class){
                    if (mInstance == null){
                        mInstance = new GreenDaoManager(context);
                    }
                }
            }
            return mInstance;
        }
        public DaoSession getDaoSession(){
            return  daoSession;
        }
        public DaoMaster getDaoMaster(){
            return daoMaster;
        }
        public static SQLiteDatabase getDb() {
            return db;
        }
    }
    

    七、GreenDao基本操作

    1. 获取UserDao对象
    mUserDao = GreenDaoManager.getmInstance(this).getDaoSession().getUserDao();
    
    • 数据库的增删改查都是通过UserDao来进行的,操作如下:
    User mUser = new User((long)1,"张三");
    mUserDao.save(mUser);//添加一个User
    
    • 除了insert之外还可以save,如下
    User mUser = new User((long)1,"张三");
    mUserDao.insert(mUser);//保存一个User
    
    • 删除数据和修改数据的思路是一样的,都是要先查找到数据:
    List<User> users = (List<User>) mUserDao.queryBuilder().where(UserDao.Properties.Id.le(10)).build().list();  
            for (User user : users) {  
                mUserDao.delete(user);  
            }  
    
    • where表示查询条件,这里是查询id小于等于10的数据,where中的参数可以有多个,就是说可以添加多个查询条件。最后的list表示查询结果是一个List集合,如果只想查一条数据,最后unique即可。当然,也可以根据id来删除数据:
    User user = mUserDao.queryBuilder().where(UserDao.Properties.Id.eq(16)).build().unique();  
            if (user == null) {  
                Toast.makeText(MainActivity.this, "用户不存在", Toast.LENGTH_SHORT).show();  
            }else{  
                mUserDao.deleteByKey(user.getId());  
            }  
    
    • 根据主键删除:
    mUserDao.deleteByKey(id);
    
    • 删除所有数据
    mUserDao.deleteAll();
    
    • 根据ID修改数据
    mUser = new User((long)2,"anye0803");
    mUserDao.update(mUser);
    
    • 查询全部数据
    List<User> users = mUserDao.loadAll();    
    
    • 查询一条数据
    User user = mUserDao.queryBuilder().where(UserDao.Properties.name.eq("张三")).unique();
    

    八、升级GreenDao数据库

    数据库的升级其实就两个步骤

    1. 修改gradle文件
    • 首先在module的gradle文件中修改版本号:
    //改为最新的版本号
    schemaVersion 2
    
    1. 修改实体类
    @Entity  
    public class User {  
        @Property  
        private int age;  
        @Property  
        private String password;  
        @Id  
        private Long id;  
        @Property(nameInDb = "USERNAME")  
        private String username;  
        @Property(nameInDb = "NICKNAME")  
        private String nickname;  
    }
    
    • 重新编译项目运行即可。一般的数据库升级这样就可以了,特殊情况下可能需要自己编写数据库迁移脚本。

    九、遇到的问题

    报错.png
    • 解决方法:
      gradle官网上下载了gradle-3.5-all版本,并且在Android Studio中进行设置;
      file—>settings—>build,execution,deployment—>Gradle。点击Apply,然后点击OK即可。如下图所示:
    配置Gradle.png

    十、刚刚接触,记录下来,与君共勉。欢迎大家关注我的微信公众号。

    二维码.jpg

    相关文章

      网友评论

        本文标题:GreenDao的简单使用

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