您的位置:首页 > 移动开发 > Android开发

Android ORM 框架之GreenDAO(二) 进阶

2016-10-08 17:53 351 查看
    Android ORM 框架之 GreenDAO(一) 简单使用 这篇文章讲解了使用 GreenDAO创建DAO以及使用该DAO创建数据库、表等,没有涉及过多的数据库操作以及更新,今天就来看看GreenDAO的这些具体操作如何实现。

一、概述。

1. schema。

 实体数据schema是你定义的第一个对象,通过schema的版本和缺省的java包调用构造器。

// 第一个参数是数据库版本号,第二个参数是根目录的包路径
int version=1;
String defaultPackage="cn.xinxing.model";
Schema schema = new Schema(version, defaultPackage);


2. 实体。

一旦你拥有了一个schema对象,就可以使用它去添加实体了。

//一个实体(类)就关联到数据库中的一张表
Entity entity = schema.addEntity("Student");

默认表名就是大写实体类名,当然也可以指定表名,

entity.setTableName("student");


3. 属性和主键。(即给表中添加字段) 

给实体添加属性,调用实体的addXXXProperty("属性名")方法添加属性即可。

entity.addStringProperty("name").notNull();//添加String类型的name,不能为空
entity.addIntProperty("age");//添加Int类型的age
entity.addDoubleProperty("score");//添加Double的score
当然,你也可以指定主键,并且主键是自增长,

entity.addIdProperty().primaryKey().autoincrement();//添加Id为主键,自增长


GreenDAO会自动根据实体类属性创建表字段,并赋予默认值。例如在数据库方面的表名和列名都来源于实体类名和属性名。默认的,表中列名是大写单词。在使用GreenDAO时,一个实体类只能对应一个表,目前没法做到一个表对应多个实体类,或者多个表共用一种对象类型。(在生成的实体类中,int类型为自动转为long类型)

二、增删改查。

1. 插入

(1). 插入

public void insertStudent(Student student) {
mStunentDao.insert(student);
}


如果student指定主键与表中已经存在了,就会发生异常,不能插入

(2). 替换或插入

mStunentDao.insertOrReplace(student);
当主键存在的时候会替换,所以能够很好的执行插入操作

(3). 批量插入

public void insertStudents(List<Student> students){
mStunentDao.insertInTx(students);
}


2. 删除

(1). 根据id删除某一条数据

public void deleteStudentById(long id) {
mStunentDao.deleteByKey(id);
}
(2).  删除单条,传入实体类

mStunentDao.delete(student);


(3). 批量删除

public void deleteStudent(List<Student> students) {
mStunentDao.deleteInTx(students);
}


(4). 删除所有

public void deleteAllStudent() {
mStunentDao.deleteAll();
}
3. 更新

(1). 单条更新

public void update(Student student) throws Exception {
mStunentDao.update(student);
}
(2). 批量更新

public void updateStudents(List<Student> students) throws Exception {
mStunentDao.updateInTx(students);
}
4. 查询

(1). 单条查询

public Student queryStudentById(long id) throws Exception {
return mStunentDao.load(id);
}


(2). 获取某张表的所有数据

public List<Student> getAllStudents() {
return mStunentDao.loadAll();
}


QueryBuilder

QueryBuilder可以帮助你构建自定义的查询语句,而不使用SQL的情况。并不是每个人都喜欢书写SQL语句,当然很容易就会出一些错,这些错误只有在运行的时候才会被发现。而QueryBuilder很容易使用,节省了你书写SQL语句的时间。
(3). 复合查询

举例:查询所有姓名为“job”的用户,且按姓名排序。

List list = mStunentDao.queryBuilder()
.where(StudentDao.Properties.Name.eq("job"))
.orderAsc(StudentDao.Properties.Name)
.list();
QueryBuilder方法采用build链式结构可以灵活地添加各种查询相关的约束,where包含具体的查询条件,limit表示查询数据的条目数量,offset表示查询数据的起始位置,orderAsc表示根据某一列进行排序,最后list得到查询结果。

GreenDAO还提供了多重条件查询。db.and表示查询条件取"与",db.or表示查询条件取"或"。

有关查询更加详解的说明,请参考这篇文章greenDAO系列5--查询

三、数据库版本更新。
当数据库表中的字段更改时,我们便需要更新数据库。那么如何使用GreenDAO来执行该操作呢!需要我们重写DaoMaster.OpenHelper的onUpgrade()方法,默认情况下,GreenDao升级的时候,将所有的表删除后再建,所以我们需要在onUpgrade()中处理有关升级操作。

1. 实例1,给某表添加新字段。

首先 修改数据库的版本号,

int version=2;


接着,添加字段

entity.addIntProperty("sno");//学号 新增
重新运行ExampleDaoGenerator类,重新生成新的java实体和处理业务的dao层等。(运行前,可先删除java-gen目录下的包和类)

最后,DbHelper需要继承DaoMaster.OpenHelper,重新onUpgrade()方法,

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
Log.i("greenDAO-DbHelper", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
if(newVersion==2){
// 修改Student表
db.execSQL("ALTER TABLE 'Student' ADD  'SNO' int");
}
}
运行后,查看数据库Student表新增了一列并且旧的数据还在,截图如下所示,



2. 实例2,增加一个新表。

首先 修改数据库的版本号,

int version=3;
接着,添加了一个新表成绩表,

private static void addScore(Schema schema) {
Entity score = schema.addEntity("Score");
//给实体类中添加属性(即给表中添加字段)
score.addIdProperty().primaryKey().autoincrement();//添加Id,自增长
score.addIntProperty("sno");//学号
score.addLongProperty("score");//成绩
}
并且需要在ExampleDaoGenerator的main()方法中,添加

addScore(schema);


重新运行ExampleDaoGenerator类,重新生成新的java实体和处理业务的dao层等。(运行前,可先删除java-gen目录下的包和类)

最后,DbHelper需要继承DaoMaster.OpenHelper,重新onUpgrade()方法,

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
Log.i("greenDAO-DbHelper", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
if(newVersion==3){
ScoreDao.createTable(sqLiteDatabase,false);
}
}
运行后,查看数据库多了一个新表,截图如下所示,





可以看到表名是大写的类名,表中字段名也是大写。

至此,有关数据库表升级就结束了!相信你看到这里,有关数据库表升级,那都不是事!


四、小结

     使用GreenDAO来处理Sqlite,是不是很方便快捷呢!两篇文章从入门到复杂,讲解了有关GreenDAO的具体操作!各位同学看完之后,记得要多动手才行!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: