Android GreenDao框架使用 基础篇

参考

官方文档

Github

一.准备工作

在工程的build.gradle文件中添加

 repositories {
       ...
        mavenCentral()
    }
    dependencies {
        ...
        classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' 
    }

在项目的build.gradle文件中添加

apply plugin: 'org.greenrobot.greendao'
android {
    ...
    greendao {
        schemaVersion 1
        daoPackage 'com.greendao.database.dao'
        targetGenDir 'src/main/java'
    }
}

(1)schemaVersion:指定数据库schema版本号,迁移等操作会用到;
(2)daoPackage:通过gradle插件生成的数据库相关文件的包名,默认为你的entity所在的包名;
(3)targetGenDir:自定义生成数据库文件的目录,可以将生成的文件放到我们的java目录中,而不是build中,这样就不用额外的设置资源目录了。

dependencies {
    ...
    implementation 'org.greenrobot:greendao:3.3.0'
}

(1)当Bean类对象发生改变时,schemaVersion的数值要增加。
(2)目前引用的版本是最新版,后续更新要注意上方的参考文档。
(3)如果是在libiray中使用,implementation 一定要换成api

二. 创建实体类

例:

@Entity
public class TestUser {
    @Id(autoincrement = true)
    private Long id;
    @NotNull
    private String name;
    @NotNull
    private int age;
    @NotNull
    private String sex;
    @Index(unique = true)
    private String uid;
}

主键一定要大写的Long。
点击Build → Make Project会自动生成代码。

@Entity
public class TestUser {
    @Id(autoincrement = true)
    private Long id;
    @NotNull
    private String name;
    @NotNull
    private int age;
    @NotNull
    private String sex;
    @Index(unique = true)
    private String uid;
    @Generated(hash = 1872927493)
    public TestUser(Long id, @NotNull String name, int age, @NotNull String sex,
            String uid) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.uid = uid;
    }
    @Generated(hash = 925009630)
    public TestUser() {
    }
    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;
    }
    public String getUid() {
        return this.uid;
    }
    public void setUid(String uid) {
        this.uid = uid;
    }
}

这个类要用到很多的注解,我也简单的整理了一下。

注解参数解释
@Entity@Entity注释标记的Java类作为greenDAO一个presistable实体。
@Idautoincrement主键,参数autoincrement 是使ID值不断增加(不重用旧值)的标志,必须是long或Long属性作为其主键。
@NotNull表明值不能为空
@Indexunique在属性上使用@Index为相应的数据库列创建数据库索引,unique =true表明强制所有值都是唯一的

注解就先整理这些,具体可以在使用时有目的的查询或参考官方文档。

三.初始化

可以将初始化以及增删改查进行封装,在初始化时需要context而且只需要初始化一次,为防止内存泄露所以我们将初始化放在Application进行操作。

public class GreenDaoManager {

    private static GreenDaoManager greenDaoManager;

    private DaoMaster daoMaster;
    private DaoSession daoSession;
    private Context context;
    private DaoMaster.DevOpenHelper helper;

    /**
     * 私有化
     */
    private GreenDaoManager() {

    }

    /**
     * 对外暴露的获取方法
     *
     * @return 单例对象
     */
    public static GreenDaoManager getInstance() {
        if (null == greenDaoManager) {
            synchronized (GreenDaoManager.class) {
                if (null == greenDaoManager) {
                    greenDaoManager = new GreenDaoManager();
                }
            }
        }
        return greenDaoManager;
    }

    /**
     * 初始化
     *
     * @param context 上下文
     */
    public void init(Context context) {
        this.context = context;
    }

    /**
     * 获取管理特定架构的所有可用DAO对象
     *
     * @return daoSession
     */
    public DaoSession getDaoSession() {
        if (daoSession == null) {
            if (daoMaster == null) {
                daoMaster = getDaoMaster();
            }
            daoSession = daoMaster.newSession();
        }
        daoSession.clear();
        return daoSession;
    }

    /**
     * 是否打印 数据库的日志信息 默认不开启
     */
    public void setDebug(Boolean isDebug) {
        QueryBuilder.LOG_SQL = isDebug;
        QueryBuilder.LOG_VALUES = isDebug;
    }

    /**
     * 关闭所有的操作 数据库用完的时候必须关闭 节省资源
     */
    public void closeConnection() {
        closeHelper();
        closeSession();
    }

    /**
     * 判断是否存在数据库,如果没有则创建数据库
     *
     * @return DaoMaster
     */
    private DaoMaster getDaoMaster() {
        if (null == daoMaster) {
            helper = new DaoMaster.DevOpenHelper(context, "test-db", null);
            SQLiteDatabase db = helper.getWritableDatabase();
            daoMaster = new DaoMaster(db);
        }
        return daoMaster;
    }

    /**
     * 关闭 help
     */
    private void closeHelper() {
        if (helper != null) {
            helper.close();
            helper = null;
        }
    }

    /**
     * 关闭 会话
     */
    private void closeSession() {
        if (daoSession != null) {
            daoSession.clear();
            daoSession = null;
        }
    }
}

这里面用到了单例模式,可以参考我之前的博客。

应用最广的模式-单例模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值