gpt4 book ai didi

android - 使用 Activity 实例保存游标状态?

转载 作者:行者123 更新时间:2023-11-29 22:34:08 25 4
gpt4 key购买 nike

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

有没有什么方法可以在 Activity 暂停或停止时保存光标的状态/位置,以便在 Activity 恢复时恢复光标并位于与 Activity 暂停/停止时相同的位置?

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

感谢您的宝贵时间!

最佳答案

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

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

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


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

@Ryan:的确,如果您不能重新创建相同的光标,那么在没有光标状态的情况下保存位置是非常无用的 - 这就是我在回复的后半部分所说的。我假设你的 RANDOM() 是一个标准的 SQL 函数? (顺便说一下,Android 中的语法是什么?我无法让我的数据库接受它。)如果是这样,那么您可能必须使用蛮力方法来重新创建光标。我的意思是用“rowId = ? OR rowId = ? OR rowId = ? OR....”重新查询数据库,选择参数是您从原始游标中检索到的 rowId。它不是很漂亮,可能有更好的方法来做到这一点,但这会奏效。使用像这样的循环构建 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 方法中将原始游标中的 rowId 保存到 long[] savedRows 中。然后您可以将它们传递到新的数据库查询中。


同样,评论太长了:

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

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

关于android - 使用 Activity 实例保存游标状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2724670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com