最近使用了Objectbox作为新项目的数据库后台,Greendao开发团队新力作,但是Objectbox算是比较新的一个东西,现在资料也不多。

今天跟大家分享一个关于Box类的getAll()函数的遇到的一点坑。

我们首先看一下Box类的getAll函数的说明,

java.util.List<T> getAll()
Returns all stored Objects in this Box.

以Lists的形式返回box中的所有对象。

我很自然地加了一个检验是否返回为null的

List<StockInfo> stockInfoList=stockInfoBox.getAll();//getAll函数你要判断是不是一个emptylist
if(stockInfoList!=null)
return stockInfoList;
return new ArrayList<StockInfo>();

结果当表为空的时候,我要往stockInfoList里面添加数据时,程序瞬间崩溃了,其中最关键的log告诉我

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=65537, result=3, data=Intent { (has extras) }} to activity {com.elliott.zheng.xica/com.elliott.zheng.xica.Activity.MainActivity}: 
java.lang.UnsupportedOperationException at android.app.ActivityThread.deliverResults(ActivityThread.java:3769)

UnsupportedOperationException 也就是由于不支持的操作导致的异常。

经过一番痛苦的调试,查看下列getAll函数源码,发现当box为空时,getAll函数返回的不是null而是Collections.emptyList()

/**
* Returns all stored Objects in this Box.
*/
public List<T> getAll() {
Cursor<T> cursor = getReader();
try {
T first = cursor.first();
if (first == null) {
return Collections.emptyList();
} else {
ArrayList<T> list = new ArrayList<>();
list.add(first);
while (true) {
T next = cursor.next();
if (next != null) {
list.add(next);
} else {
break;
}
}
return list;
}
} finally {
releaseReader(cursor);
}
}

这个东西非常神奇,它的长度为空,不支持add操作,而且它不等于null,所以上面我那个语句判断 stockInfoList!=null 为true而

直接将这个Collection.emptyList()生成的对象直接返回,而当我试图往里面add元素时,程序直接崩溃,因为这个对象不允许进行add()操作,一旦进行添加操作,会直接抛出异常,

说不支持这种操作,导致程序崩溃。

解决办法:判断getAll函数返回值是否等于Collections.EMPTY_LIST(这里判断返回值是否为null,没有用),即

List<StockInfo> stockInfoList=stockInfoBox.getAll();//getAll函数返回值应判断是不是一个emptylist
if(stockInfoList!=Collections.EMPTY_LIST)
return stockInfoList;
return new ArrayList<StockInfo>();

让我疑惑不解的是,在Collections类的定义中,EMPTY_LIST好像就是定义为null啊。。。。,但是将返回值和null比较又不相等。

public static final List EMPTY_LIST = null;

知道的朋友希望能够在评论区指出,如果文章有错误欢迎在评论区讨论,共同进步。

作者: Elliott Zheng

出处: http://www.cnblogs.com/elliottzheng/p/8068055.html>

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(elliott.zheng@foxmail.com)咨询.

最新文章

  1. C语言file相关函数学习
  2. 在Ubuntu 14.04安装Nginx
  3. yii2.0 的数据的 查 删
  4. Entity Framework查询,EF执行SQl
  5. 推荐一个markdown编辑器-MarkdownPad
  6. Css控制div水平垂直居中显示
  7. 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释
  8. mysql中group by和order by同时使用无效的替代方案
  9. Spring Boot2.0使用Spring Security
  10. 【Python基础】lpthw - Exercise 45 制作游戏
  11. AtCoder square869120 Contest #3 F sushi
  12. DWR、Comet4j在Nginx+Tomcat组合下的优化
  13. poj_1390 动态规划
  14. 中国省市 Json 二级联动
  15. Oracle Union Union All 对查询结果集操作
  16. C# 中访问修饰符
  17. scrollHeight、clientHeight、offsetHeight、scrollTop等的定义以及图解
  18. C语言函数重入
  19. 带你剖析WebGis的世界奥秘----瓦片式加载地图(转)
  20. golang 三个点的用法

热门文章

  1. django 自带的验证功能
  2. PHP漏洞全解—————9、文件上传漏洞
  3. Doxygen生成美丽注释文档(1):初体验
  4. java——链表映射 LinkedListMap
  5. python 横向比较最大值 贴标签
  6. maya2017无法安装卸载激活失败
  7. WSGI学习系列Pecan
  8. pta5-9 Huffman Codes (30分)
  9. FZU 2202——犯罪嫌疑人——————【思维题】
  10. Wpf鼠标点击坐标转为屏幕坐标/后台重新设置在Canvas和Grid上的位置