如何在Android应用程序中保存数据

use*_*371 50 android

我最近编写了一个Android应用程序.它只是一个简单的应用程序,允许您通过几个简单的计数器间隔保持篮球比赛的得分.我要求添加保存功能,这样您就可以保存您的分数,然后重新加载它们.目前,当您停止应用时,您的数据会丢失.所以我想知道的是我必须添加以使应用程序保存标签(分数)然后重新加载它.谢谢大家抱歉,我对这些东西知之甚少.

gob*_*dor 68

你有两个选择,我会把选择留给你.

  1. 共享首选项

    这是Android独有的框架,允许您在键值框架中存储原始值(例如int,boolean,并且String严格来说,String这不是原始的).这意味着您为值指定一个名称,例如"homeScore"并将值存储到此键.

    SharedPreferences settings = getApplicationContext().getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putInt("homeScore", YOUR_HOME_SCORE);
    
    // Apply the edits!
    editor.apply();
    
    // Get from the SharedPreferences
    SharedPreferences settings = getApplicationContext().getSharedPreferences(PREFS_NAME, 0);
    int homeScore = settings.getInt("homeScore", 0);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 内部存储器

    在我看来,这是你可能正在寻找的.您可以将任何想要的内容存储到文件中,这样可以提供更大的灵活性.但是,该过程可能比较棘手,因为所有内容都将存储为字节,这意味着您必须小心保持读写过程协同工作.

    int homeScore;
    byte[] homeScoreBytes;
    
    homeScoreBytes[0] = (byte) homeScore;
    homeScoreBytes[1] = (byte) (homeScore >> 8);  //you can probably skip these two 
    homeScoreBytes[2] = (byte) (homeScore >> 16); //lines, because I've never seen a                   
                                                  //basketball score above 128, it's
                                                  //such a rare occurance.
    
    FileOutputStream outputStream = getApplicationContext().openFileOutput(FILENAME, Context.MODE_PRIVATE);
    outputStream.write(homeScoreBytes);
    outputStream.close();
    
    Run Code Online (Sandbox Code Playgroud)

现在,您也可以查看外部存储,但我不建议在这种特殊情况下,因为外部存储可能不会在以后存在.(注意,如果你选择它,它需要一个权限)

  • 大声笑 - 我喜欢这条评论"因为我从未见过高于128的篮球得分":-) btw:供您参考:http://www.nba.com/pistons/news/highest_score_071211.html (20认同)
  • 在Hyrule,活着的最富有的人只能拥有255卢比.;) (7认同)

Edw*_*alk 11

OP正在要求一个"保存"功能,这不仅仅是在程序的执行过程中保存数据(你必须为应用程序做任何事情.)

我建议将数据保存在SD卡上的文件中,这样您不仅可以在以后调用它,还允许用户将设备作为外部驱动器安装在自己的计算机上,并获取数据以便在其他地方使用.

所以你真的需要一个多点系统:

1)实施onSaveInstanceState().在这个方法中,你传递了一个Bundle,它基本上就像一个字典.在捆绑包中存储尽可能多的信息,以便在完全停止的位置重新启动应用程序.在您的onCreate()方法中,检查传入的包是否为非空,如果是,则从包中恢复状态.

2)实施onPause().在此方法中,创建一个SharedPreferences编辑器并使用它来保存下次启动应用程序所需的任何状态.这主要包括用户的偏好(因此名称),但与应用程序的启动状态相关的任何其他内容也应该在此处.我不会在这里存储分数,只是你需要重启应用程序的东西.然后,在onCreate()没有包对象时,使用SharedPreferences接口调用这些设置.

3a)对于像分数这样的东西,你可以按照上面的Mathias的建议并将分数存储在返回的目录中getFilesDir(),使用openFileOutput()等等.我认为这个目录是应用程序的私有目录并且存在于主存储器中,这意味着其他应用程序和用户无法访问数据.如果你没问题,那么这可能就是你要走的路.

3b)如果您确实希望其他应用程序或用户可以直接访问数据,或者数据将非常大,那么SD卡就是您的选择.选择一个像com/user1446371/basketballapp /这样的目录名,以避免与其他应用程序发生冲突(除非您确定您的应用程序名称相当独特)并在SD卡上创建该目录.正如Mathias指出的那样,您应首先确认已安装SD卡.

File sdcard = Environment.getExternalStorageDirectory();
if( sdcard == null || !sdcard.isDirectory()) {
    fail("sdcard not available");
}
File datadir = new File(sdcard, "com/user1446371/basketballapp/");
if( !datadir.exists() && !datadir.mkdirs() ) {
    fail("unable to create data directory");
}
if( !datadir.isDirectory() ) {
    fail("exists, but is not a directory");
}
// Now use regular java I/O to read and write files to data directory
Run Code Online (Sandbox Code Playgroud)

我建议为您的数据使用简单的CSV文件,以便其他应用程序可以轻松读取它们.

显然,您必须编写允许"保存"和"打开"对话框的活动.我通常只是调用openintents文件管理器并让它完成工作.但是,这要求您的用户安装openintents文件管理器以使用这些功能.


Mar*_*son 8

在onCreate:

SharedPreferences sharedPref = getSharedPreferences("mySettings", MODE_PRIVATE);

    String mySetting = sharedPref.getString("mySetting", null);
Run Code Online (Sandbox Code Playgroud)

在onDestroy或等效:

SharedPreferences sharedPref = getSharedPreferences("mySettings", MODE_PRIVATE);

    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putString("mySetting", "Hello Android");
    editor.commit();
Run Code Online (Sandbox Code Playgroud)


Mat*_*adt 5

使用SharedPreferences,http://developer.android.com/reference/android/content/SharedPreferences.html

以下是一个示例:http: //developer.android.com/guide/topics/data/data-storage.html#pref

如果数据结构更复杂或数据量很大,请使用Sqlite数据库; 但是对于少量数据和非常简单的数据结构,我会说,SharedPrefs会做,而DB可能会有开销.