让它保存它所在的位置很容易,只需在 onPause 方法中添加一些代码,如下所示:
protected void onPause(){
position = yourCursor.getPosition();
super.onPause();
}
其中位置是一个类字段(即在任何方法之外声明,通常在顶部)。然后在 onResume 中,您只需将光标移回该位置即可。如果您不熟悉 onPause()/onResume(),请阅读 activity lifecycle。但是,我怀疑您还想保存随机选择的问题。我认为您的光标不会在 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);
这是假设您在 onPause 方法中将原始光标中的 rowIds 保存到 long[] savedRows 中。然后,您可以将它们传递到新的数据库查询中。
同样,对于 cmets 来说太长了:
@Ryan:很好,他们可能不会以相同的顺序被拉回。你可以尝试看看,但很难说它总是以相同的顺序返回是侥幸还是设计使然。好的,想法 3 正在创建一个中间表,其中填充了 20 个随机问题。该表将有一列作为其行号(为您提供问题的顺序),然后是一个外键列,其中包含问题表中问题的 rowId。从该表中以相同顺序检索您的问题很容易,一旦用户完成所有问题,您就可以删除该表。或者,您甚至可以保留表格,以便用户可以看到他们在过去的问题集上的表现 - 但这是一个完全不同的功能。
注意:我应该在我的第一篇文章中也提到 onSaveInstanceState。 onPause 是在更改活动之前进行快速保存的好地方,但简单地将位置保存到 int 中并不是万无一失的。显然,当用户开始一个新的测验时它会重置(因为它应该),但是如果当用户正在查看另一个活动时,它也会重置,操作系统必须终止你的进程以获取内存。在这种情况下,当用户返回活动时,它必须从 onCreate 重新启动,因此它会丢失可变数据。这旨在与 onSaveInstanceState() 方法一起使用,该方法为您提供了一个可以将数据保存到其中的 Bundle。然后在 onCreate 中提供相同的 Bundle,允许您重新加载任何必要的内容,并使其看起来像应用程序从未被杀死。