zoukankan      html  css  js  c++  java
  • ORM框架greenDao 2 (用于了解旧版本的使用方法,目前最新版本为3.2.2,使用注释的方式来生成)

    摘要: Android中对SQLite数据库使用,是一件非常频繁的事情。现今,也有非常多的SQLite处理的开源框架,其中最著名的greenDao,它以占用资源少,处理效率高等特点,成为优秀的ORM框架之一。那么对于greenDao 2要如何使用呢?以及使用过程中需要注意哪些事项呢?那么这篇文章一定能够得到你想要的答案。
     

    人生就是一连串的抉择,每个人的前途与命运,完全把握在自己手中,只要努力,终会有成。就业也好,择业也罢,创业亦如此,不要活在别人的嘴里,不要活在别人的眼里,而是把命运握在自己手里。

    书客创作

    在了解greenDao之前首要知道什么是SQLite,什么是ORM?
    SQLite是一款轻量级嵌入式关系型数据库,也是移动端最为常用的一种关系型数据库。
    ORM对象关系映射,简单一点说就是实现数据库表结构与对象一一对印。

    对象关系映射

    greenDao简介

    官网解释:greenDAO: Android ORM for your SQLite database。
    greenDAO是Android中对SQLite进行对象关系映射的一个框架。

    greenDao之所以很流行,跟它的优点是息息相关的:

    • 一个精简的库
    • 性能最大化
    • 内存开销最小化
    • 易于使用的 API
    • 对 Android 进行高度优化

    Android中ORM框架有很多,如OrmLite,ActiveAndroid等,但是相对而言,greenDao性能更加优秀。
    常用orm框架对比图

    greenDao-Generator2使用

    在使用greenDao之前要生成相应的表,Bean,Dao文件等,这个生成过程可以利用Eclipse/MyEclipse/Android Studio等相关工具来实现。
    如果使用Eclipse/MyEclipse实现,需要添加greendao-generator:2.1.0和freemaker两个jar。
    如果使用Android Studio实现,只要在创建的Java Module中添加greendao-generator:2.1.0即可。
    下面将以Android Studio为例,实现这一功能。

    配置:首先创建一个Android工程,然后添加一个Module(Java Library),最后在Module的build.gradle文件中中添加greendao-generator:2.1.0依赖。

    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        compile 'de.greenrobot:greendao-generator:2.1.0'
    }

    使用:greendao-generator是用来生成相应的表,Bean,Dao文件等。假如要生成一个用户表,一个朋友表,一个用户可以有多个朋友,一个朋友数据最多对应一个用户,那么该如何实现呢?

    public class ZGenerator {
        public static void main(String args[]) {
            // 创建一个模式Shcema
            // 参数1-版本,参数2-包名
            Schema schema = new Schema(1, "cc.ibooker.daogenerator");
    
            // 添加Entity-相当于表-用户对象
            // 参数-代表生成对象类名
            Entity user = schema.addEntity("User");
            user.addIdProperty().autoincrement();// 添加ID-自增
            user.addLongProperty("uId");
            user.addStringProperty("uRealname");
            user.addStringProperty("uSex");
            user.addStringProperty("uBirthday");
            user.addFloatProperty("uHeight");
            user.addFloatProperty("uWeight");
            user.addStringProperty("uDomicile");
            user.addLongProperty("uPhone");
            user.addStringProperty("uEmail");
            user.addStringProperty("uWeibo");
    
            // 朋友表/对象
            Entity friend = schema.addEntity("Friend");
            friend.addIdProperty().autoincrement();// 添加ID-自增
            friend.addStringProperty("fGname");
            // 添加外键-只能关联User主键
            Property fUid = friend.addLongProperty("fUid").getProperty();
    
            friend.addToOne(user, fUid);// 一对一
            user.addToMany(friend, fUid).setName("friends");// 一对多
    
            // 生成相关文件
            try {
                // 参数1-schema,参数2-生成路径
                new DaoGenerator().generateAll(schema, "app/src/main/java");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    1、创建Schema(设置模式)

    /**
     * @param version 版本号-可以理解为数据库版本号
     * @param defaultJavaPackage 默认包名-即文件生成路径
     **/
    Schema schema = new Schema(int version, String defaultJavaPackage);

    2、添加表对象

    /**
     * @param className 生成Bean文件的类名
     **/
    Entity entity = schema.addEntity(String className);
    // 添加主键-并实现主键自增
    entity.addIdProperty().autoincrement();
    // 添加字段名-根据添加类型进行设置
    entity.addStringProperty(String propertyName);
    entity.addLongProperty(String propertyName);

    添加外键-只能关联主键

    // 添加外键-只能关联User主键
    Property property = entity.addLongProperty(String propertyName).getProperty();

    一对一关联

    /**
     * @param target 目标表对象(关联对象)
     * @param fkProperty 外键
     **/
    entity.addToOne(Entity target, Property fkProperty);

    一对多关联

    /**
     * @param target 目标表对象(关联对象)
     * @param fkProperty 外键
     **/
    ToMany tomany = entity.addToMany(Entity target, Property fkProperty);
    // 设置外键对象名称
    tomany.setName(String name);

    3、编译执行

    try {
        // 参数1-schema,参数2-生成根路径
        new DaoGenerator().generateAll(schema, "app/src/main/java");
    } catch (Exception e) {
        e.printStackTrace();
    }

    Generator生成结构图

    greenDao2使用

    配置:在build.gradle(app)中加入greendao:2.1.0依赖。

    dependencies {
        compile 'de.greenrobot:greendao:2.1.0'
    }

    使用:greendao:2.1.0主要是用来操作数据库,而对于数据库的操作主要是增删改查。
    在实现数据库增删改查之前必须对相关Dao文件进行实例化,那么该如何进行实例化呢?

    // 获取一个可读可写数据库对象,参数1-上下文对象,参数2-数据库名称,参数3-游标工厂CursorFactory
    SQLiteDatabase db = new DaoMaster.DevOpenHelper(this, "ibookerdata.db", null).getWritableDatabase();
    // 获取DAO模式
    DaoMaster daoMaster = new DaoMaster(db);
    DaoSession daoSession = daoMaster.newSession();
    FriendDao friendDao = daoSession.getFriendDao();
    UserDao userDao = daoSession.getUserDao();

    对Dao对象进行实例化之后,就可以通过相关Dao来操作相关表。
    1、插入数据-GreenDao可以实现单一对象插入和批量插入功能。

    • 插入一条数据
    // 参数为User对象
    long id = userDao.insert(User user);
    • 批量插入数据
    // 参数为User对象集
    userDao.insertInTx(List<User> users);

    2、修改数据-GreenDao可以实现单一对象修改和批量修改功能。

    • 修改一条数据
    // 参数为User对象
    userDao.update(User user);
    • 批量修改数据
    // 参数为User对象集
    userDao.updateInTx(List<User> users);

    3、删除数据

    • 删除一条数据
    userDao.delete(User user);
    • 根据主键ID删除数据
    userDao.deleteByKey(K key);
    • 批量删除数据
    userDao.deleteInTx(List<User> users);
    • 删除所有数据
    userDao.deleteAll();

    4、查询数据

    • 查询所有数据-三种方式
    // 方式一
    List<User> list = userDao.queryBuilder().list();
    // 方式二
    List<User> list = new ArrayList<>();
    Iterator iterator = userDao.queryBuilder().listIterator();
    while (iterator.hasNext()) {
         User user = (User) iterator.next();
         // 一般用来筛选需要的对象
         list.add(user);
    }
    // 方式三
    userDao.loadAll();
    • 懒加载-记得使用完之后关闭掉close
    LazyList<User> list = userDao.queryBuilder().listLazy();
    list.close();
    • 条件查询
    // keyWord为关键字
    // 查询相等数据
    userDao.queryBuilder().where(UserDao.Properties.URealname.eq(keyWord)).unique();
    // 查询相等数据集
    userDao.queryBuilder().where(UserDao.Properties.URealname.eq(keyWord)).list();
    // 查询不相等数据
    userDao.queryBuilder().where(UserDao.Properties.URealname.notEq(keyWord)).list();
    // 模糊查询
    userDao.queryBuilder().where(UserDao.Properties.UBirthday.like("%" + keyWord + "%")).list();
    // 范围查询-minValue最小值,maxValue最大值
    userDao.queryBuilder().where(UserDao.Properties.UBirthday.between(minValue, maxValue)).list();
    // 查询大于
    userDao.queryBuilder().where(UserDao.Properties.UHeight.gt(keyWord)).list();
    // 大于等于
    userDao.queryBuilder().where(UserDao.Properties.UHeight.ge(keyWord)).list();
    // 小于
    userDao.queryBuilder().where(UserDao.Properties.UWeight.lt(keyWord)).list();
    // 小于等于
    userDao.queryBuilder().where(UserDao.Properties.UWeight.le(keyWord)).list();
    // 升序查询
    userDao.queryBuilder().orderAsc(UserDao.Properties.Id).list();
    // 倒序查询
    userDao.queryBuilder().orderDesc(UserDao.Properties.Id).list();
    • 原生SQL查询
    // 查询有朋友的用户信息
    String sql = "_id in (select f_uid from friend)";
    userDao.queryBuilder().where(new WhereCondition.StringCondition(sql)).list();
    • 线程查询
    final Query query = userDao.queryBuilder().build();
    new Thread(new Runnable() {
         @Override
         public void run() {
             query.forCurrentThread().list();
         }
    }).start();
    • 一对一查询
    List<Friend> list = friendDao.queryBuilder().list();
    for (Friend friend : list) {
        User user = friend.getUser();
    }
    • 一对多查询
    List<User> list = userDao.queryBuilder().list();
    for (User user : list) {
        List<Friend> friends = user.getFriends();
    }

    greenDao提供了很多方法,这里只是写了一些常用方法。

    GitHub地址

  • 相关阅读:
    2月16号
    2月15号
    dubbo与springmvc的简单使用
    dubbo与zookeeper学习中的问题
    linux下jdk与tomcat的安装与配置
    mysql存储引擎
    mysql存储过程
    mysql子查询与连接查询
    mysql简单增删改查(CRUD)
    SpringMvc执行流程
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/9887718.html
Copyright © 2011-2022 走看看