Android操作数据库的框架-GreenDao基本使用记录

相信不论是从事任何语言的开发工作,都会离不开数据存储这个问题,Android也是,虽然Android自带了一个SQLite轻量级数据库,操作起来也并不算麻烦,不过相信作为开源的受益者,大家也都被各种方便的框架,开发库给惯“坏”了,我从一开始也是什么Json解析,Xml解析,图片处理都是喜欢用原生的,不过在求知的驱使下使用过方便的开发库,如Gson,ButterKnife注解之后,就觉得真的是方便很多很多!感谢开发这些东西的大神们。

同样,在秉着多学点总没坏处的原则下,我与一个数据库的框架邂逅了,就是GreenDao,

在这里就记录下,认识她的全过程(仅是记录我自己开发App的时候如何使用的,不作为通用教程但可参考)。

       主要分为两部分:

一、项目配置

首先,切换的Project结构,main-->右键-->new Directory-->新建名为java-gen的文件夹。



App目录下build.gradle文件中android{}标签下,添加如下代码:

sourceSets {
    main {
        java.srcDirs = ['src/main/java', 'src/main/java-gen']
    }
}


同样是App目录下build.gradle文件中,添加如下依赖:

//操作数据库的库
compile 'org.greenrobot:greendao:3.2.0'
compile 'org.greenrobot:greendao-generator:3.2.0'


File-->New-->NewModule-->Java Library-->Next-->命名随意(我是命名为greendao)-->Finish,新建Java Library。




在该Java Library的build.gradle文件中同样加入如下代码:

compile 'org.greenrobot:greendao-generator:3.2.0'



在该Java Library下的src中的GreenDao类中添加如下代码(可供参考,更多用法可自行研究,这里只记录基础用法),注意下面提到的目录一定要是你自己的java-gen文件夹的目录:

    public static void main(String[] args) throws Exception {
        // 正如你所见的,你创建了一个用于添加实体(Entity)的模式(Schema)对象。
        // 两个参数分别代表:数据库版本号与自动生成代码的包路径。
        Schema schema = new Schema(1, "com.qinshou.yedaitreasure.greendao");
//      当然,如果你愿意,你也可以分别指定生成的 Bean 与 DAO 类所在的目录,只要如下所示:
//      Schema schema = new Schema(1, "com.qinshou.yedaitreasure.bean");
//        schema.setDefaultJavaPackageDao("com.qinshou.yedaitreasure.dao");
        addDistrict(schema);

//         模式(Schema)同时也拥有两个默认的 flags,分别用来标示 entity 是否是 activie 以及是否使用 keep sections。
//         schema2.enableActiveEntitiesByDefault();
//         schema2.enableKeepSectionsByDefault();

//         一旦你拥有了一个 Schema 对象后,你便可以使用它添加实体(Entities)了。

        // 最后我们将使用 DAOGenerator 类的 generateAll() 方法自动生成代码,此处你需要根据自己的情况更改输出目录(既之前创建的 java-gen)。
        // 其实,输出目录的路径可以在 build.gradle 中设置,有兴趣的朋友可以自行搜索,这里就不再详解。
        new DaoGenerator().generateAll(schema, "G:/workspace/YeDaiTreasure/app/src/main/java-gen");
    }



并添加如下方法(以一个操作城市的数据库为例):

private static void addDistrict(Schema schema) {
    // 一个实体(类)就关联到数据库中的一张表,此处表名为「Province」(即类名)
    Entity province = schema.addEntity("District");
    // 你也可以重新给表命名
    // province.setTableName("NODE");

    // greenDAO 会自动根据实体类的属性值来创建表字段,并赋予默认值
    // 接下来你便可以设置表中的字段:
    province.addIdProperty();
    // 与在 Java 中使用驼峰命名法不同,默认数据库中的命名是使用大写和下划线来分割单词的。
    // For example, a property called “creationDate” will become a database column “CREATION_DATE”.
    province.addStringProperty("province_name").notNull();
    province.addStringProperty("city_name").notNull();
    province.addStringProperty("district_name").notNull();
}


然后,就可以对这个Library进行编译了。



如果中间没有任何差错的话,将会出现如下提示,这就说明GreenDao的Library编译成功了,其实这时候就要把这个Library删了,但是我舍不得。因为情怀。到此,项目的配置工作就算是完成了。



二、基本使用

最好是在Application中对GreenDao进行初始化,可以将DistrictDao对象定义为静态对象,并添加一个get方法供外面需要的时候调用:

private void setupDatabase() {
    // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
    // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
    // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
    // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
    DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
    db = helper.getWritableDatabase();
    // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
    daoMaster = new DaoMaster(db);
    daoSession = daoMaster.newSession();
    districtDao=daoSession.getDistrictDao();
}


基本的增加、修改和查询(删除我还没用到,不过想着应该也很简单):

    private void insertDistrict(District district) {
        App.getDistrictDao().insert(district);
    }

    private void updateDistrict(District district) {
        App.getDistrictDao().update(district);
    }

    private List<District> queryDistrictes() {
        // Query 类代表了一个可以被重复执行的查询
        Query<District> query = App.getDistrictDao().queryBuilder()
                .orderAsc(DistrictDao.Properties.Id)
                .build();
//      查询结果以 List 返回
        List<District> provinces = query.list();
        // 在 QueryBuilder 类中内置两个 Flag 用于方便输出执行的 SQL 语句与传递参数的值
        QueryBuilder.LOG_SQL = true;
        QueryBuilder.LOG_VALUES = true;
        return provinces;
    }


尽管不是一行代码实现数据库,但是我觉得相对于Android原生的SQLite数据库操作要简单太多太多了,原生是情怀,如果有提高效率的方法,何乐而不为呢。

程序员的道路任重道远,希望自己可以在Android开发的道路上越走越远。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值