用活动实例保存游标状态?

时间:2010-04-27 20:07:50

标签: android cursor cursor-position savestate

我有一个Android应用程序从SQLite数据库中随机抽取20个问题(行)作为游标,并循环遍历所有问题,向用户询问所有20个问题。

当活动暂停或停止时,是否有某种方法可以保存光标的状态/位置,以便当活动恢复时光标恢复并处于与活动暂停/停止时相同的位置?

如果您需要我发布我的代码,请询问。

谢谢你的时间!

1 个答案:

答案 0 :(得分:2)

让它保存它所处的位置非常简单,只需在onPause方法中添加一些代码就像这样:

protected void onPause(){
 position = yourCursor.getPosition();
 super.onPause();
}

其中position是一个类字段(即在任何方法之外声明,通常在顶部)。然后在onResume中,您可以将光标移回该位置。如果您不熟悉onPause()/ onResume(),请阅读activity lifecycle。但是,我怀疑你想保存随机选择哪些问题。我不认为你的光标会持续穿过onPause / onResume,因为它们通常在onPause中关闭以避免内存问题。我唯一能想到的,但我不是专家,是你必须保存问题的rowID,然后重新查询数据库以获取这些行。解决方案的笨拙程度取决于您首先查询随机问题的方式。如果您已经生成了20个随机数,然后将其提供给您的查询,那么您可以重复使用相同的方法,但使用20个已保存的行。


这太长了,无法作为评论:

@Ryan:的确,如果你不能重新创建一个相同的光标,那么在没有光标状态的情况下保存位置是没有用的 - 这就是我在回复的后半部分所说的。我假设您的RANDOM()是标准的SQL函数? (顺便说一下Android中的语法是什么?我无法让我的数据库接受它。)如果是这样,那么你可能需要使用暴力方法重新创建光标。我的意思是用“rowId =?OR rowId =?OR rowId =?OR ....”重新查询数据库,选择参数args是你从原始游标中检索到的rowIds。它不漂亮,可能有更好的方法,但这将有效。使用如下循环构建SELECT String很简单:

String selectQuery = "";
String[] selectArgs = new String[savedRows.length];
for (int i = 0; i < savedRows.length; i++){
    selectQuery = selectQuery.concat("rowID = ? OR ");
    selectArgs[i] = Long.toString(savedRows[i]);
}

//Remove the last " OR " you'd have in the string
int index = selectQuery.lastIndexOf(" OR ");
selectQuery = selectQuery.substring(0, index);

这是假设您将rowIds从原始光标保存到onPause方法中的long[] savedRows。然后,您可以将它们传递给新的数据库查询。


同样,评论太长了:

@Ryan:好的一点,他们可能不会以相同的顺序被撤回。你可以试验一下,但很难说它是侥幸还是设计总是按照相同的顺序返回。好的,想法3然后是创建一个中间表,其中填充了20个随机问题。该表将有一个列号用于行号(给出问题的顺序),然​​后是一个带有问题表中问题的rowId的外键列。从这个表中以相同的顺序检索你的问题很容易,你可以在用户完成所有问题后删除表。或者,您甚至可以保留表格,以便用户可以看到他们在过去的问题集上做得如何 - 但这是一个完全不同的功能。

注意:我应该在我的第一篇文章中提到过onSaveInstanceState。 onPause是一个在更改活动之前进行快速保存的好地方,但只是将位置保存到int中并非万无一失。显然,当用户开始一个新的测验(应该如此)时它会重置,但是当用户正在查看另一个活动时,它也会重置,操作系统必须终止你的进程以获取内存。在这种情况下,当用户返回活动时,它必须从onCreate重新启动,因此它会丢失可变数据。这适用于onSaveInstanceState()方法,该方法为您提供了一个可以保存数据的Bundle。然后在onCreate中提供相同的Bundle,允许您重新加载任何必要的内容并使其看起来像应用程序从未被杀死。