Android 你在使用光标吗

Android 你在使用光标吗,android,sqlite,cursor,Android,Sqlite,Cursor,在android中重复使用游标对象对数据库进行多个查询是一种好的做法吗?我是否需要在查询之间调用deactivate()?在第二次查询后,我将停用游标,但仍会在logcat中收到DatabaseObjectNotClosedException警告。根据我的经验,您可以将游标设置为新的值。我试着在上面调用deactivate(),但这打乱了我的应用程序,所以我决定不使用它。我不知道这是否是一个好的实践,但它对我来说运行良好,就我的测试而言,它似乎没有泄漏或减慢任何速度。嗯,requery()已经被

在android中重复使用游标对象对数据库进行多个查询是一种好的做法吗?我是否需要在查询之间调用deactivate()?在第二次查询后,我将停用游标,但仍会在logcat中收到DatabaseObjectNotClosedException警告。

根据我的经验,您可以将游标设置为新的值。我试着在上面调用deactivate(),但这打乱了我的应用程序,所以我决定不使用它。我不知道这是否是一个好的实践,但它对我来说运行良好,就我的测试而言,它似乎没有泄漏或减慢任何速度。

嗯,
requery()
已经被弃用,但出于某种原因,
deactivate()
不是。如果没有另一个,就无法真正使用其中一个,因此我想您可以假设不应该使用
deactivate()
。在任何情况下,在使用完光标后立即将其关闭将消除所有讨厌的
数据库对象NotClosedException
。新的加载器框架鼓励返回新的游标,旧的游标在替换它们时会自动关闭

现在已经弃用了
requery()
deactivate()
(自API 11以来的第一个,后一个自API 16以来的)。我回答这个差不多有7年历史的问题是因为我相信还没有一个正确的答案

根据我的经验,重新使用
游标
对象是一种不好的做法。
我对
SQLiteOpenHelper
类的实现有几种方法,我在所有这些方法中都关闭了
游标
对象,我相信因为我在每个方法的末尾关闭了
游标
对象,所以它是正确的。但在某些方法中,我重新使用了一个
游标
对象来保存多个查询的结果(首先我运行了一个查询,然后我读取并使用了
游标
,然后我运行了另一个查询,我认为它只会在已经使用的
游标
中覆盖旧结果)。启用
StrictMode
证明我错了。我开始出现
DatabaseObjectNotClosedException
崩溃

我通过不再重新使用
光标
对象修复了它。现在,我为每个查询创建一个新的
Cursor
变量,然后读取并保存结果,并在
Cursor
上调用
close()
方法,不再使用它。如果我需要在该方法中运行另一个查询,我故意不再使用旧的
游标
,并且总是创建一个新变量。即使启用了
StrictMode
,我也不会再收到任何警告或崩溃。我相信垃圾收集器的工作是正确的,所以我不认为创建
Cursor
类的多个实例是一个大问题。另一方面,我们只使用一个
光标
对象,就像一个问题一样-因此,您的警告和我的警告会与
StrictMode
崩溃


我不是一个数据库专家,我还在学习Android编程的最佳实践,但我相信在这个主题上我是正确的——不要重复使用
游标
对象,否则你可能会出现内存泄漏、警告甚至崩溃。

游标不会进行查询,它会保存查询结果。我看不出为什么不能将其设置为null,然后重新使用它。在再次查看文档后,我认为我需要调用deactivate(),然后请求一个新的游标。我认为在请求新游标之前,没有必要将其设置为null。这不是真的。您可以在不使用重新查询的情况下使用deactivate。Requery已被弃用,因为您不需要调用它。您只需调用deactivate,然后通过调用database.rawQuery()或类似的方法创建一个新的游标。