最佳光标使用方法

3
我发现有很多关于使用Cursor对象的链接,但没有关于如何最好地使用它的资料。所以我有几个问题,真的希望得到回答:

  • 在整个应用程序中使用一个Cursor对象是否可以? 如果不行,为什么?
  • 每次使用后都需要打开和关闭Cursor吗?
  • 链接上,close()的定义是“关闭游标,释放其所有资源并使其完全无效。” 当它变得无效时会发生什么? 它可以被重复使用吗?
非常感谢。

  1. 游标包含查询结果...每次查询都会得到新的游标。
  2. 是的,这是必要的。
  3. 无效意味着无效... 无效的游标不能被使用或重新使用...
- Selvin
那么,如果游标变得无效且无法使用,为什么有必要关闭它呢? - ClaireG
释放资源时,您可能会遇到与Bitmap.recycle()类似的情况。这些API在内部是用C编写的,因此没有垃圾回收机制。因此,您必须明确地声明:“我不再需要它”。 - Selvin
3个回答

3

1.)一个游标是否可以用于应用程序的所有数据库操作?如果不行,为什么?

是的。可以重复使用一个游标。但是您应该知道,游标的工作并不像您想象的那样直观。游标不会从某个数据存储中获取所有数据并将其全部存储在内存中。相反,它只在需要时获取数据,从而最小化内存使用。因此,在重新初始化之前关闭游标总是一个好主意。话虽如此,每次需要一个新游标创建一个完全新的游标实际上没有太多性能惩罚。

2.)每次使用后是否有必要打开和关闭游标?

是的,是的,还是的。我曾经遇到过很多网络应用程序调试问题,这些问题是为了定期同步手机活动到本地数据库,然后发送到外部服务器。打开和关闭(尤其是关闭)非常重要,就像Java或Android中的任何其他通信流或端点一样,例如FileInputStream或Socket。

3.)在此链接上,close()的定义是关闭游标,重用其所有资源,并使其完全无效。当它变得无效时会发生什么?它可以重复使用吗?

就像我上面说的那样,close()方法的工作方式就像Java其他类的大多数close()方法一样。一旦您调用它,就不应再使用游标。这就像Socket类的close()方法一样。一旦Socket被关闭,它将不可用于进一步的网络使用(即无法重新连接或重新绑定)。需要创建一个新的套接字。


谢谢你,linuxjava。这正是我在寻找的答案 :) - ClaireG

1
1. 每个查询都会返回一个新的Cursor。因此,您可以使用相同的本地游标,并使用返回的游标重新初始化它。
2. 是的,关闭每个游标是必要的。因为一些意外错误/强制关闭可能会破坏您打开的数据库,并且还可以释放资源。
3. 无效意味着无效...无效的游标不能被使用或重复使用,正如Selvin所说。

0

谢谢,这个链接非常有用,但它并没有回答我所有的问题。 - ClaireG
只要你理解了光标加载器的工作和流程,所有问题都将得到解答。它完全管理光标的生命周期。 - Evgeni Roitburg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接