安卓:如何取消/中断/终止挂起的SQLite查询?

3

我的安卓应用程序中,用户可以填充导入的数据到数据库中,然后执行预定义的、复杂的SQL查询。对于某些数据模式,查询将需要很长时间(在HTC Hero上可能需要数分钟以上),而常见用法则不超过10-15秒。

有没有办法在安卓上取消待处理的SQLite查询?超时也是可以的,不需要部分结果。我是在AsyncTask.doInBackground()中执行查询的。

我知道最好的方式是优化查询或改变应用逻辑,但在这种情况下,结果仍取决于用户的知识水平,所以我想帮助那些遇到问题的用户。

4个回答

3
您无法取消挂起的SQL查询。它是在SQLite引擎中完成的。SQLite有本地方法来中断查询,但在Java接口中不可访问。
最好的方法是改善查询性能。 请阅读此内容:http://www.sqlite.org/cvstrac/wiki?p=PerformanceTuning 您可以通过限制行数将长时间运行的查询分成更小的部分。然后更容易取消以块执行的查询。

0

0

ASyncTask支持取消操作,标志应该包括所有内容,包括您的SQL查询。

ASyncTask.cancel(boolean mayInterruptIfRunning)

5
这还不够。 实际上,来自 doInBackground() 的代码仍然被保留,因为 AsyncTask 流通过 onCancelled() 返回,但 Cursor 仍然停留在 moveToFirst() 上并占用了整个 CPU。 我试图关闭 SQLiteDatabase 或 SQLiteOpenHelper,但调用这些对象中的任何一个都会阻塞执行,直到 moveToFirst() 完成。而且,Cursor 没有“取消”方法。 - tomash

0
您可以使用android.os.CancellationSignal取消在sqlite上运行的查询,该信号可以传递给android.database.sqlite.SQLiteDatabase的某些方法。

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