最近在Android手机开发中使用了ORM框架Sugar1.4,节省了大量代码,同时也遇到不少麻烦,记录如下:

1. 使用group by将查询结果转换为POJO对象

在Sugar1.4中,可以使用如下代码将查询结果转换为POJO对象。

List<POJO> results = SugarRecord.findWithQuery(POJO.class, sql);
1.1. 额外的ID字段

该方法会调用SugarRecord类的inflate方法,如下:

     private static void inflate(Cursor cursor, Object object, Map<Object, Long> entitiesMap) {
List<Field> columns = ReflectionUtil.getTableFields(object.getClass());
if (!entitiesMap.containsKey(object)) {
entitiesMap.put(object, cursor.getLong(cursor.getColumnIndex(("ID"))));
} for (Field field : columns) {
field.setAccessible(true);
Class<?> fieldType = field.getType();
if (isSugarEntity(fieldType)) {
try {
long id = cursor.getLong(cursor.getColumnIndex(NamingHelper.toSQLName(field)));
field.set(object, (id > 0) ? findById(fieldType, id) : null);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else {
ReflectionUtil.setFieldValueFromCursor(cursor, field, object);
}
}
}

注意第4行代码,会在entitiesMap中缓存查询结果与ID,所以在构造查询语句sql的时候,需要额外增加一个ID字段。

1.2. SQLite大小写敏感问题

在Sugar官方文档中,类字段通过下划线命名法映射到数据表的对应列(见上代码12行NamingHelper)。

查看NamingHelper源码,其返回结果为大写,但官方示例的条件查询中全部都使用的小写,由于SQLite一般类型列大小写不敏感,所以在一般情况下是没有问题的。

但是!当在SQL中使用AS语法重命名后,就大小写敏感了!

所以在group by查询中,必须将汇总列重命名为大写的下划线命名,才能在Sugar中映射到POJO实例的对应列。

1.3. SQLite不支持IF语法

SQLite不支持IF语法,但可以使用CASE WHEN语法代替。

CASE WHEN first conditional expression THEN column value
WHEN second conditional expression THEN column value
WHEN third conditional expression THEN column value
END CASE WHEN conditional expression THEN column value
ELSE default column value
END

Android免坑指南(一)Sugar与SQLite的更多相关文章

  1. Unity Android交互过坑指南

    Unity Android交互过坑指南 介于网上看过很多unity和Android交互的教程,都或多或少的漏掉了一些部分,导致编译过程中出现各种问题,特此整理一份教程,仅供参考 介绍 本次实现的是在游 ...

  2. Android连接远程数据库的避坑指南

    Android连接远程数据库的避坑指南 今天用Android Studio连接数据库时候,写了个测试连接的按钮,然后连接的时候报错了,报错信息: 2021-09-07 22:45:20.433 705 ...

  3. Android开发权威指南(第2版)新书发布

    <Android 开发权威指南(第二版)>是畅销书<Android开发权威指南>的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45 章精彩内容供 ...

  4. 两百条微信小程序跳坑指南(不定时更新)

    微信小程序联盟出品 跳坑textarea<二百二十三>不显示文本及textarea相关问题集合跳坑<二百一十三> background-image无法获取本地资源图片....跳 ...

  5. 《Android编程权威指南》

    <Android编程权威指南> 基本信息 原书名:Android programming: the big nerd ranch guide 原出版社: Big Nerd Ranch Gu ...

  6. 《Android Studio有用指南》4.27 使用演示模式

    本文节选自<Android Studio有用指南> 第4章第27节 作者: 毕小朋 眼下本书已上传到百度阅读, 在百度中搜索[Anroid Studio有用指南]便能够找到本书. 什么是演 ...

  7. 《Android Studio实用指南》4.27 使用演示模式

    本文节选自<Android Studio实用指南> 第4章第27节 作者: 毕小朋 目前本书已上传到百度阅读, 在百度中搜索[Anroid Studio实用指南]便可以找到本书. 什么是演 ...

  8. electron 编译 sqlite3避坑指南---尾部链接有已经编译成功的sqlite3

    electron 编译 sqlite3避坑指南(尾部链接有已经编译成功的sqlite3) sqlite很好用,不需要安装,使用electron开发桌面程序,sqlite自然是存储数据的不二之选,奈何编 ...

  9. 《Android编程权威指南》PhotoGallery应用梳理

    PhotoGalley是<Android编程权威指南>书中另外一个重要的应用.       

随机推荐

  1. [OpenSource]浅谈.Net和Java互相调用的三种方式

    在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份额,不管谁对谁错,Java和.Net是目前应用开发的两个 ...

  2. Prism - WPF MVVM(Model-View-ViewModel)设计模式【学习】

    开发工具: VS2010 Blend Prism框架 基本概念: 数据绑定,依赖属性,依赖对象 WPF 委托式命令 Icommand接口 Lambda表达式 MVVM(Model-View-ViewM ...

  3. LoadRunner调用Java程序—性能测试-转载

    LoadRunner调用Java程序—性能测试   为了充分利用LoadRunner的场景控制和分析器,帮助我们更好地控制脚本加载过程,从而展现更直观有效的场景分析图表.本次将重点讨论LoadRunn ...

  4. asp.net 中Session的运用,及抛出错误“未将对象引用设置到对象的实例”

    1. 页面载入后,必须要等到page_Load方法执行建立 page对象后才可以使用Session 2. 在.aspx和.cs文件中使用Session的区别 (1).aspx: Session[&qu ...

  5. [TSOI2005]Exhibit

    问题描述 博览馆正在展出由世上最佳的 M 位画家所画的图画. wangjy 想到博览馆去看这几位大师的作品. 可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字, a 和 b ,代 ...

  6. 【CSS】Beginner2:Selectors, Properties, and Values

    1.Whereas HTML has tags,CSS has selectors.   2.Selector{ properties:value; properties2:value2; }   3 ...

  7. HW3.20

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  8. UVa1424–Salesmen(DP)

    题目大意 给定一个包含n(n<=100)个点的无向连通图和一个长度为L的序列A(L<=200),你的任务是修改尽量少的数,使得序列中的任意两个相邻的数或者相同,或者对应图中两个相邻结点 题 ...

  9. 两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素。

    一.思路:1.创建两个空栈A和B:2.A栈作为队列的入口,B栈作为队列的出口:3.入队列操作:即是入栈A:4.出队列操作:若栈B为空,则将A栈内容出栈并压人B栈,再出 B栈:不为空就直接出栈: 二.代 ...

  10. 每个android项目都应该使用的android 库

    http://blog.teamtreehouse.com/android-libraries-use-every-project A good developer knows to never re ...