相信不论是从事任何语言的开发工作,都会离不开数据存储这个问题,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开发的道路上越走越远。