Android ORM 框架之GreenDAO(二) 进阶

    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的具体操作!各位同学看完之后,记得要多动手才行!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值