【问题标题】:Android, sharedpreferences or internal storage?Android、共享首选项或内部存储?
【发布时间】:2011-07-26 02:17:10
【问题描述】:

我想存储一些基本数据,例如 player_name、levels_completed、fastest_speed、fastest_time,并在每次玩家开始我正在制作的一个愚蠢的小游戏时将其显示出来......这是执行此操作的最佳方法?

Sharedprefs 还是内部存储?

我在http://developer.android.com/guide/topics/data/data-storage.html 并且刚刚对使用哪个感到困惑,因为它们看起来既好又容易做到。

建议?

谢谢!

【问题讨论】:

  • 对我来说,sharedprefs 提供的键/值存储更容易/使用起来更轻松——不过这只是我的看法。希望其他人可以为您提供更多信息:)
  • 谢谢亚历克斯,如果这不是一个秘密,你介意分享一些关于你如何实现它的代码吗?干杯!

标签: android sharedpreferences data-storage


【解决方案1】:

这几乎取自 Facebook sdks 示例之一(它允许您保存 FB 会话,因此用户不必每次都登录)...不过我会为您修改一下

public class SessionStore {

private static final String PLAYER_NAME = "player_name";
private static final String LEVELS_COMPLETED = "levels_completed";
private static final String HIGH_SCORE = "high_score";

private static final String KEY = "player_session";

int highScore;
int levelsCompleted;
String pName;

public static boolean saveSession(Context context, String player_name, int levels_completed, int high_score) {
    Editor editor =
        context.getSharedPreferences(KEY + player_name, Context.MODE_PRIVATE).edit();
    editor.putString(PLAYER_NAME,player_name);
    editor.putInt(LEVELS_COMPLETED, levels_completed);
    editor.putInt(HIGH_SCORE,high_score);

    return editor.commit();
}

public static void restoreSession(Context context, String player_name) {
    SharedPreferences savedSession =
        context.getSharedPreferences(KEY + player_name, Context.MODE_PRIVATE);
    highScore = savedSession.getInt(HIGH_SCORE,0);
    levelsCompleted = savedSession.getInt(LEVELS_COMPLETED,0);
    pName = savedSession.getString(PLAYER_NAME,"NO_NAME!");

}

public String getName()
{
      return pName;
}

}

我想你明白了基本的想法......

一些要点:我使用“KEY + player_name”以防不同玩家在同一部手机上玩(如果它是静态的,你会用另一个玩家的数据覆盖一个玩家的数据)。

此外,当您执行pName = savedSession.getString(PLAYER_NAME,"NO_NAME!"); 时,如果共享首选项中不存在任何内容,则默认值为“NO_NAME!”同样对于 getInts(在这种情况下,我将它们默认为 0)

在程序中,您将使用SessionStore.saveSession("Alex",50000,50000); 来保存会话等。希望这能提供有关如何使用它的一个很好的要点...另外请记住,我是一个 android 新手 - 这对我很有用,但是我不是专家:D

【讨论】:

  • 谢谢老兄!我会等一会儿,如果没有其他人写信提出与你写的内容相悖的建议,我会选择你的答案
【解决方案2】:

如果是静态的游戏数据,您可以使用共享首选项。如果是动态数据,比如玩家高分等,我会使用 sqlite 数据库。我实际上认为数据库是一个更简单的选择,因为在内部存储上创建读/写缓冲区可能有点棘手。

public void StoreTimeAppend(String MY_DATA, File file) {
    try {
        FileOutputStream fos = openFileOutput(String.valueOf(file), MODE_APPEND);
        Writer out = new OutputStreamWriter(fos, "UTF8");
        out.write(MY_DATA + '\n');
        out.close();
        fos.close();
    } catch (IOException e) {
        Tip.setText("ISSUE");
    }
} 

【讨论】:

  • 我还没有接触数据库 :( 仍处于我的书的早期阶段,所以这对我来说现在不是一个选择。它只是在偏好和内部存储之间。谢谢!
  • 哦,我明白了。我不能保证这是正确的(我现在只使用数据库)但是对于我的第一个应用程序,我使用了内部存储。我使用了一个文件输入流和一个流写入器来存储信息,它工作得很好。
  • 我的应用程序在我的另一台计算机上。我会启动它并为您发布一些代码。
  • 这么多新人开始使用 Android,我很害怕我会成为这个网站上仅有的新人之一 :)) Thakns Adam,将等待并检查代码
  • 好的,所以我写了一个函数来写入我作为参数传递的文件
猜你喜欢
  • 2011-10-27
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 2011-09-03
  • 1970-01-01
相关资源
最近更新 更多