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