保存数据的最佳方法 - 首选项,sqlite,可序列化或其他?

时间:2011-02-10 20:41:21

标签: android file

我一直在研究在转弯之间保存游戏数据的替代方法,并想知道是否有人能指出我正确的方向。

我有大约32k的数据,必须在onPause期间保存。由于数据量巨大,我排除了偏好。我花了几天时间玩SQLite,但无法在不到两秒的时间内保存数据(尽管时间肯定没有浪费)。

我已决定在游戏开始时使用数据库加载常量数据。这肯定会更容易调整游戏中的各种参数和默认值。但这仍然让我寻找理想的数据写入方法。

需要保存的数据基本上是9次出现A类,9次出现在B类。我是Android学习曲线的密集月份(以及来自C ++背景的Java的细微差别)和一直在谷歌上搜索疯狂。这带来了两种可能性 -

1)序列化(ObjectOutputStream)

我认为这将是一个完美的解决方案,但是,在阅读了有关该主题的其他几篇文章之后,由于速度和内存分配导致垃圾收集器陷入潜在的愤怒,因此在Android平台上强烈推荐它。 / p>

2)DataOutputStream类

我目前的想法是向两个类添加加载和保存函数,并使用其中的DataOutputStream和DataInputStream调用来分别写入和读取数据。

类中的数据是基元(主要是字符串和整数)和基元数组,所以没有什么太复杂可以分解。这第二个解决方案看起来是一个好的,可行的吗?或者还有其他我不知道的解决方案吗?

4 个答案:

答案 0 :(得分:2)

为什么数据库写入有2秒的限制?如果纯粹是出于UI响应的原因,那么您可以采取另一种方法。

您实际上不必在onPause方法本身中执行保存,您可以启动实际为您执行保存的新Thread

private void backgroundSave(){
    Thread backgroundThread = new Thread() {
        @Override
        public void run() {
            //do save here
        }
    };
    backgroundThread.start();
}

@Override
protected void onPause() {
    super.onPause();
    backgroundSave();
}

您也可以使用AsyncTask

当用户在保存完成之前尝试重新启动您的应用时,您可能需要考虑这种情况,但这不应该太难以考虑。

答案 1 :(得分:2)

您应该使用Async任务来保存数据,我使用此方法在游戏开始时获取高分:

new HighscoreTask().execute(this);

Async任务如下所示:

public class HighscoreTask extends AsyncTask<MainView, Void, Void> {

    protected void onPreExecute() {
    }

    protected void onPostExecute(final Void unused) {
    }
    @Override
    protected Void doInBackground(MainView... params) {
        HighScoreFactory.syncScores();
        return null;
    }
}

所有数据库交互都发生在 HighScoreFactory.syncScores()中,这可能需要多长时间,因为它发生在后台。在我的例子中,它向外部服务器发送HTTP请求并将它们加载到数据库中。它从来没有引起任何问题,无缝地工作。

答案 2 :(得分:1)

您是否尝试过在交易中将数据插入数据库?

try{
 db.beginTransaction();

 //here insert data to database    

 db.setTransactionSuccessful();
} finally {
 db.endTranscation();
}

这可以加快操作。

答案 3 :(得分:0)

使用Context.openFileOutput(String name,int mode)创建一个新的Thread来执行数据写入,并将其作为上下文。然后,您可以使用新线程在后台编写它并使用以下内容检索它:Context.openFileInput(String name),并将其作为上下文。希望这会有所帮助。