[Android]GreenDao(二)——使用

上一篇讲了GreenDao的配置,本篇着重于API的各种使用,并附上Demo。

类的关系

大家还记得上一篇讲到的代码自动生成的四个类,DaoMaster,DaoSession,Dao,User,排除最后一个User实体类不说,其他三个的关系应该是非常明确的。

从图上看出,得到User对象的步骤。其中还有些细节需要说明。

获取DaoMaster

用过数据库的程序圆都清楚,我们需要DaoSession对象来进行对数据库的增删改查。

DaoMaster中有newSession()的方法可以帮我们实现。

所以我们应该先实例化DaoMaster,具体代码是

public DaoMaster(SQLiteDatabase db) {
    super(db, SCHEMA_VERSION);
    registerDaoClass(UserDao.class);
}

噢,需要一个SQLiteDatabase实例,请拼命想一想怎么获取一个SQLiteDatabase实例?

没错,通过SQLiteOpenHelper,再仔细看一下DaoMaster,好像已经提供了抽象类OpenHelper继承了SQLiteOpenHelper

Cool!

可以获取DevOpenHelper,具体代码是

     /**
     * WARNING: Drops all table on Upgrade! Use only during development.
     */
    public static class DevOpenHelper extends OpenHelper {
        public DevOpenHelper(Context context, String name, CursorFactory factory) {
            super(context, name, factory);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
            dropAllTables(db, true);
            onCreate(db);
        }
    }

先不管警告的注释(当数据库升级的时候会删除所有表,仅限于开发时使用)。

只要简单两行代码

DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, DB_NAME, null);
DaoMaster daoMaster = new DaoMaster(mHelper.getReadableDatabase());
//也可以使用mHelper.getWritableDatabase();

注意:getReadabledatabase()与getWritableDatabase()其实返回的实例都是一样的,只是当内存空间不足的时候,就不能继续写入数据,更为重要的是,它们都是耗时耗时耗时操作!更为详细的解释

获取DaoSession

接着,我们来获取DaoSession

DaoSession daoSession = daoMaster.newSession();
//异步查询,异步查询,异步查询
AsyncSession asyncSession = daoSession.startAsyncSession();

够简单吗?获得DaoSession后可以干什么?其实增删改查的基本功能已经齐全。

只是有三个缺点:

  • 颗粒度太大
  • API不是很方便
  • 官网注释说只是用于快捷操作

所以UserDao登场吧

获取UserDao

UserDao userDao = daoSession.getUserDao();

好了,下面就可以随心所欲地操作数据库了。

操作数据库

/**
 * 插入一个User对象
 *
 * @param user
 * @return 插入对象的列id
 */
public long insert(User user) {
    UserDao userDao = getUserDao();
    return userDao.insert(user);
}

查查查*重点

具体方法有

  • queryXXX(...),指明各种条件
  • 使用QueryBuilder(单次查询),Query(多次查询)
  • 其他等

这里着重讲QueryBuilderQuery,个人用得非常顺手,因为自己对SQL语句并不喜欢,so…

看一个简单例子

/**
 * 通过id取得用户。此处使用QueryBuider,并没有构造Query
 *
 * @param id
 * @return
 */
public User getUserById(long id) {
    UserDao userDao = getUserDao();
    //获取QueryBuilder
    QueryBuilder qb = userDao.queryBuilder();
    //声明条件,属性在UserDao中已经存在
    qb.where(UserDao.Properties.Id.eq(id));
    //返回唯一数据
    return (User) qb.unique();
}

QueryBuilder只是用来创建Query而已,Query更使用于相同的查询,所以QueryBuilder就不要随便用了。

  • Query通过QueryBuilder.build()获取,它是使用Builder模式设计的,支持多次查询多线程查询

    //实际按照要求具体操作
    Query<User> query = userDao.queryBuilder().orderDesc().where().count().build();
    //返回单一结果
    query.unique()
    //返回一个非null的实体。否则就会抛出一个DaoException。
    query.uniqueOrThrow()
    //所有查询都加载到内存
    query.list();
    //实体按照需求加载进入内存。一旦列表中的一个元素被第一次访问,它将被加载同时缓存以便以后使用。必须close。
    query.listLazy();
    //多线程查询,为当前线程获取一个Query实例
    query.forCurrentThread();
    
  • 支持equal,in,between等等一系列比较符
  • Query可重用

先创建如下Query,根据id = 123和age = 10进行查找(示例)

    UserDao userDao = getUserDao();
    QueryBuilder<User> queryBuilder = userDao.queryBuilder().where(UserDao.Properties.Id.eq(123));
    queryBuilder.where(UserDao.Properties.Age.eq(10)).unique();
    Query query = queryBuilder.build();
    query.unique();

下一次同样需要根据id = 321和age = 100来进行查找,就可以

//设置id和age的值
query.setParameter(321, 100);
//返回唯一结果
//query.unique()
//设置多个查找目标
query.setParameter(111, 180);
//返回list
query.list();

注意:当Query没有返回语气结果,故障排查可以设置QueryBuilder.LOG_SQL = true;QueryBuilder.LOG_VALUES = true;,打印出SQL语句

更多高级用法请查看官方API文档

基本原则是根据主键来修改,比较简单的两种情况是

  • 已知主键

直接能用API的都基本上已知主键的

    /**
     * 更新user信息
     *
     * @param newUser 新User,主键必须存在
     */
    public void update(User newUser) {
        UserDao userDao = getUserDao();
        userDao.update(newUser);
    }

* 未知主键,知道其他值

先根据主键查找(复习查找的知识),再重复情况一

同理,跟改操作基本一致。

   /**
     * 根据主键删除User
     *
     * @param id User的主键Id
     */
    public void deleteUserById(long id) {
        UserDao userDao = getUserDao();
        userDao.deleteByKey(id);
    }

总结

GreenDao给我们简化了编写大量重复代码的步骤,作为轻量级的ORM框架速度飞快,值得深入学习。

GreenDao底层并不保证线程安全,这意味着多线程环境下还需要我们程序圆来控制 ;)

源码链接

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 20:20:00

[Android]GreenDao(二)——使用的相关文章

android蓝牙(二)——接收数据

在蓝牙开发中,我们有这样的一个需求:我们的android客户端要始终保持和蓝牙的连接,当蓝牙有数据返回的时候,android客户端就要及时的收取数据,当蓝牙没有数据返回的时候我们就要保持android客户端和蓝牙之间的连接.这个时候我们就要采取socket来实现和蓝牙之间的连接.做项目使用过http轮询去获取数据,但是发现那样总是有一定的弊端.于是就才用了socket方式去获取数据. 实现步骤:1.启动一个service去监听是否有数据返回.一旦有数据返回就启动一个线程去处理数据 2.处理完数据

android 自定义控件二之仿QQ长按删除

自定义Dialog 1.先上个效果图: 虽然效果丑了点,但主要学习修改已有的控件,例如修改Dialog控件 2.一些基本的只是进行了解 Dialog: theme是Dialog的样式,常用样式为: <style name="MyDialogStyle" parent="@android:Theme.Dialog"> <item name="android:windowFrame">@null</item> &l

Android 按二次后退键退出应用程序

前言 欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net 雨季o莫忧离:http://blog.csdn.net/luckkof 正文 <span style="font-size:10px;">private static Boolean isExit = false; private static Boolean hasTask = false; Timer tExit = n

Android进阶(二十八)上下文菜单ContextMenu使用案例

上下文菜单ContextMenu使用案例 前言 回顾之前的应用程序,发现之前创建的选项菜单无法显示了.按照正常逻辑来说,左图中在"商品信息"一栏中应该存在选项菜单,用户可进行分享等操作,但是现在此操作莫名其妙的消失了.写了个测试Demo,如中图所示,一切按照逻辑显示正常.怪就怪在项目中无法显示,起初设想是因为Android系统版本太高问题,但是在别的手机上测试之后发现问题依旧存在.难道是因为顶部Tab标题栏遮挡住了选项菜单的显示?继续测试,通过在别的没有Tab标题栏的页面测试选项菜单,

转载分享:Android APP二次打包操作步骤介绍

看到好的技术教程就想转载一下,不喜勿喷!谢谢配合,仅供菜鸟学习研究,不要做坏事哦\(^o^)/~ 关于Android APP 二次打包现象已经屡见不鲜,为何"打包党"就吃准了Android平台,二次打包的操作过程到底有多简单? 本文将从Android apk的结构.二次打包的工具.步骤等方面向移动开发者说明二次打包操作的简单性,从而引起开发者对APP安全的重视,并及时对APP进行代码混淆或加固 保护等安全措施. 安卓apk的文件结构首先来看一下Android apk的内部文件结构. 随

Bmob移动后端云服务平台--Android从零开始--(二)android快速入门

Bmob移动后端云服务平台--Android从零开始--(二)android快速入门 上一篇博文我们简单介绍何为Bmob移动后端服务平台,以及其相关功能和优势.本文将利用Bmob快速实现简单例子,进一步了解它的强大之处. 一.准备工作 1.注册Bmob账号 在网址栏输入www.bmob.cn或者在百度输入Bmob进行搜索,打开Bmob官网后,点击右上角的"注册",在跳转页面填入你的姓名.邮箱.设置密码,确认后到你的邮箱激活Bmob账户,你就可以用Bmob轻松开发应用了. 2.网站后台创

Android转载二:工程目录详解

REF:http://blog.csdn.net/dianfusoft/article/details/7422540       可以看出这个工程由src,gen,Android2.3.3 jar包,assets,bin,res,AndroidManifest.xml,proguard.cfg,project.properties这几个文件(夹)组成,具体作用如下所示: 下面分层次详解几个重要的文件(夹) ● src文件夹 展开这个文件夹如下所示 可以看出,这个文件夹主要用来存放源文件 ●ge

android greenDao SQLite数据库操作工具类使用

上一篇介绍了如何建立类生成工程,现在介绍如何使用. 以下是ExampleDaoGenerator工程代码,做了一些修改 /* * Copyright (C) 2011 Markus Junginger, greenrobot (http://greenrobot.de) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in com

Android &quot;QR二维码扫描&quot;

没什么说的,上图上源码 git: http://git.oschina.net/892642257/QRCode csdn(0分): http://download.csdn.net/detail/onlyonecoder/7713589 Android "QR二维码扫描"