1

我有一个 android 应用程序,它从 SQLite DB 中随机抽取 20 个问题(行)作为光标,并循环遍历所有问题以询问用户所有 20 个问题。

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

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

谢谢你的时间!

4

1 回答 1

2

让它保存它所在的位置非常容易,只需在 onPause 方法中添加一些代码,如下所示:

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

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


这太长了,不适合作为评论:

@Ryan:确实,如果您无法重新创建相同的光标,则在没有光标状态的情况下保存位置是毫无用处的——这就是我在回复的后半部分所说的。我假设您的 RANDOM() 是标准 SQL 函数?(顺便说一句,Android 中的语法是什么?我无法让我的数据库接受它。)如果是这样,那么您可能必须使用蛮力方法来重新创建光标。我的意思是用“rowId = ? OR rowId = ? OR rowId = ? OR....”重新查询数据库,选择参数是您从原始游标中检索到的 rowIds。它不漂亮,可能有更好的方法来做到这一点,但这会奏效。使用这样的循环构建 SELECT 字符串会很容易:

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 保存到long[] savedRowsonPause 方法中的 a 中。然后,您可以将它们传递到新的数据库查询中。


同样,评论太长了:

@Ryan:好点,他们可能不会以相同的顺序被拉回来。你可以尝试看看,但很难说它总是以相同的顺序返回是侥幸还是设计使然。好的,想法 3 正在创建一个中间表,其中填充了 20 个随机问题。该表将有一列作为其行号(为您提供问题的顺序),然​​后是一个外键列,其中包含问题表中问题的 rowId。从该表中以相同顺序检索您的问题很容易,一旦用户完成所有问题,您就可以删除该表。或者,您甚至可以保留表格,以便用户可以看到他们在过去的问题集上的表现 - 但这是一个完全不同的功能。

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

于 2010-04-27T20:23:13.747 回答