美文网首页
★35.GreenDao

★35.GreenDao

作者: iDragonfly | 来源:发表于2017-06-29 00:06 被阅读0次

    导入GreenDAO

    1. 引入依赖

    • 按照 GitHub 上的说明引入依赖。

    2. 设置路径

    build.gradle(Moudule: app)中设置自定义路径:

    android {
        // ...
    }
    // 加入以下这些
    greendao {
        schemaVersion 1
        daoPackage 'com.anye.greendao.gen'
        targetGenDir 'src/main/java'
    }
    
    • schemaVersion: 指定数据库schema版本号,迁移等操作会用到。
    • daoPackage: dao的包名,可以省略,省略时包名默认是@Entity注解所在的包。
    • targetGenDir: 生成数据库文件的目录。

    简单使用

    1. 定义数据类实体

    @Entity
    public class User {
        @Id                         // @Id注解为SQL数据库左端的列,也是要用到的Key
        private Long id;
    
        private String name;
        @Transient
        private int tempUsageCount; // 非持续,不会存进数据库(非必要,只是用作示例,讲解@Transient)
    }
    

    2. 构建

    • Gradle 会生成DaoMaster类、DaoSession类和UserDao类。

    3. 设置数据库

    // 数据库的生命周期与要应用程序一致,所以要在Application内设置
    public class MyApplication extends Application {
        private SQLiteDatabase mDatabase;
        private DaoSession mDaoSession;
        public static MyApplication instances;
    
        @Override
        public void onCreate() {
            super.onCreate();
            instances = this;
            setDatabase();
        }
    
        public static MyApplication getInstances() {
            return instances;
        }
    
        // 设置数据库
        private void setDatabase() {
            // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
            // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
            // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
            // 所以,在正式的项目中,你还应该重写 DaoMaster.DevOpenHelper#onUpgrade(),来实现数据库的安全升级。
            DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-mDatabase", null);
            mDatabase = helper.getWritableDatabase();
            // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
            DaoMaster daoMaster = new DaoMaster(mDatabase);
            mDaoSession = daoMaster.newSession();
        }
    
        public DaoSession getDaoSession() {
            return mDaoSession;
        }
    
        public SQLiteDatabase getDatabase() {
            return mDatabase;
        }
    }
    

    4. 使用

    • 获取:
      mUserDao = MyApplication.getInstances().getDaoSession().getUserDao();
      
    • 增:
      mUser = new User(null, "username1");
      mUserDao.insert(mUser); //添加一个
      
    • 删:
      mUserDao.deleteByKey(id);
      
    • 改:
      mUser = new User(null, "username2");
      mUserDao.update(mUser);
      
    • 查:
      List<User> users = mUserDao.loadAll();
      String userName = "";
      for (int i = 0; i < users.size(); i++) {
          userName += users.get(i).getName()+",";
      }
      mContext.setText("查询全部数据==>"+userName);
      

    注解

    @Entity注解

    @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,
            // 是否生成所有属性构造函数,默认构造函数总是会生成的。
            generateConstructors = true,
            // 是否生成getter和setter
            generateGettersSetters = true
    )
    

    用于属性的注解

    @Entity
    public class User {
        @Id(autoincrement = true)
        private Long id;
        @Property(nameInDb = "USERNAME")
        private String name;
        @NotNull
        private int repos;
        @Transient
        private int tempUsageCount;
        // ...
    }
    
    • @Id注解使用Long类型作为数据库的主键,可以设置autoincrement参数为true来使得id值一直增长避免重复使用。
    • @Property注解使你可以使用非默认的列名。否则默认情况下会使用大写加下划线的形式,如customName会变成CUSTOM_NAME
    • @NotNull注解可以使得某些列名为非Null,通常是用来使得主键非Null的。
    • @Transient注解使得这个属性不会被记录进数据库。
    • @Index注解是用来设置索引的:
      • name:如果你不喜欢默认生成的名字,可以通过设置参数name = "abc",来设置新的索引名。
      • unique:可以通过设置参数unique = true,使得此索引唯一。
    • @Unique 唯一约束
    • @ToMany 一对多
    • @OrderBy 排序
    • @ToOne 一对一
    • @generatedGreenDao 产生的构造函数或方法

    相关文章

      网友评论

          本文标题:★35.GreenDao

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