万事须己运,他得非我贤。这篇文章主要讲述Android重新使用游标相关的知识,希望能为你提供帮助。
在android中重用游标对象在数据库上进行多次查询是一种好习惯吗?我是否需要在查询之间调用deactivate()?我在第二个查询后停用了游标,但我仍然在logcat中收到DatabaseObjectNotClosedException警告。
答案【Android重新使用游标】requery()
和deactivate()
现已被弃用(自API 11以来的第一个,自API 16以来的后者)。我正在回答这个近7年的问题,因为我认为还没有给出正确答案。
根据我的经验,重新使用Cursor
对象是一种不好的做法。我对SQLiteOpenHelper
类的实现有几种方法,我在所有这些中关闭了Cursor
对象 - 我相信,因为我在每种方法结束时关闭了Cursor
对象,所以它是正确的。但在某些方法中,我重新使用一个Cursor
对象来保存来自多个查询的结果(首先我运行查询,然后我读取并使用Cursor
的结果,然后我运行了一个不同的查询,我认为只是在已经使用过的Cursor
中覆盖旧结果。启用StrictMode
证明我错了。我开始得到DatabaseObjectNotClosedException
崩溃。
我通过不再重新使用Cursor
对象来修复它。现在我为每个查询创建一个新的Cursor
变量,然后读取并保存结果,我在close()
上调用Cursor
方法,不再使用它了。如果我需要在该方法中运行另一个查询,我故意不再使用旧的Cursor
,而且我总是创建一个新变量。即使启用了StrictMode
,我也不会再收到任何警告或崩溃。我相信垃圾收集器正确地完成了它的工作,所以我不认为创建Cursor
类的多个实例是一个巨大的问题。另一方面,重新使用一个Cursor
对象,似乎是一个问题 - 因此你的警告和我与StrictMode
的崩溃。
我不是数据库专家,我仍在学习Android编程的最佳实践,但我相信在这个主题上我是正确的 - 不要重复使用Cursor
对象,否则你可能会开始得到内存泄漏,警告和可能甚至崩溃。
另一答案根据我的经验,您可以将光标设置为新的。我已经尝试过调用deactivate(),但这搞砸了我的应用程序,所以我决定不使用它。我不知道这是不是很好的做法,但它对我来说很好,就我的测试而言,它似乎没有泄漏或减慢任何东西。
另一答案好吧,requery()
已被弃用,由于某种原因deactivate()
不是。你不能真正使用一个没有另一个,所以我猜你可以假设你不应该使用deactivate()
。在任何情况下,一旦完成它就关闭光标将摆脱所有那些讨厌的DatabaseObjectNotClosedException
。新的加载器框架鼓励返回新游标,旧游标会在您更换时自动关闭。
推荐阅读
- 更新到角度6后找不到app-root
- SQLite Android数据库游标窗口分配2048 kb失败
- sql android忽略重复检索内容
- 可能尚未为Cursor android初始化局部变量
- Android(无法从CursorWindow读取第0行,第3列。在从中访问数据之前,请确保正确初始化Cursor)
- 如何在android中使用游标(sqlite查询)搜索数据库
- 在Glassfish 5.0中部署ADF WEbapp时出错
- 如何为Electron / Atom Shell App设置应用程序图标
- 我在哪里可以找到Android的默认图标( [重复])