首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否将光标状态与活动实例一起保存?

是否将光标状态与活动实例一起保存?
EN

Stack Overflow用户
提问于 2010-04-28 04:07:50
回答 1查看 2.7K关注 0票数 1

我有一个安卓应用程序,它从SQLite数据库中随机抽取20个问题(行)作为光标,然后循环所有问题,从而向用户提出所有20个问题。

有没有办法在活动暂停或停止时保存光标的状态/位置,以便在活动恢复时,光标恢复到与活动暂停/停止时相同的位置?

如果你需要我发布我的代码,尽管问。

耽误您时间,实在对不起!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-04-28 04:23:14

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

代码语言:javascript
复制
protected void onPause(){
 position = yourCursor.getPosition();
 super.onPause();
}

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

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

@Ryan:事实上,如果你不能重新创建一个相同的光标,那么在没有光标状态的情况下保存位置是非常无用的--这就是我在回复的后半部分所说的。我假设您的RANDOM()是一个标准的SQL函数?(顺便问一下,Android中的语法是什么?我无法让我的数据库接受它。)如果是这样,那么您可能必须使用暴力方法来重新创建光标。我的意思是用"rowId =?或....“重新查询数据库。选择参数是您从原始光标检索到的rowIds。它并不美观,而且可能有更好的方法来做,但它会起作用的。使用如下所示的循环构建SELECT字符串将很容易:

代码语言:javascript
复制
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中。然后,可以将这些内容传递到新的数据库查询中。

再说一次,评论太长了:

@Ryan:说得好,他们可能不会以同样的顺序被拉回来。你可以通过实验来查看,但很难判断它是偶然的,还是按照设计总是以相同的顺序返回的。好的,第三个想法是创建一个中间表,里面填满了20个随机问题。这个表有一个列表示它的行号(为您提供问题的顺序),然后有一个外键列,其中包含问题表中问题的rowId。从这个表中以相同的顺序检索您的问题会很容易,一旦用户完成了所有问题,您就可以删除该表。或者,你甚至可以保留这个表,这样用户就可以看到他们在过去的问题集上做得有多好-但这是一个完全不同的功能。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2724670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档