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

时间:2012-06-09 15:44:39

标签: android

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

12 个答案:

答案 0 :(得分:65)

你有两种选择,我会把选择留给你。

  1. 共享偏好设置

    这是Android独有的框架,可让您存储原始值(例如intboolean,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);
    
  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();
    
  3. 现在,您还可以查看External Storage,但我不建议在这种特殊情况下,因为外部存储可能不会在以后存在。 (请注意,如果您选择此项,则需要获得许可)

答案 1 :(得分:10)

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

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

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

答案 2 :(得分:8)

on onCreate:

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

    String mySetting = sharedPref.getString("mySetting", null);

在onDestroy或同等中:

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

    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putString("mySetting", "Hello Android");
    editor.commit();

答案 3 :(得分: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可能会有开销。

答案 4 :(得分:3)

有很多选项可以存储您的数据,Android可以让您选择任何人 您的数据存储选项如下:

共享偏好设置 将私有原始数据存储在键值对中。 内部存储器 将私有数据存储在设备内存中。 外部存储 将公共数据存储在共享外部存储上。 SQLite数据库 将结构化数据存储在私有数据库中。 网络连接 使用您自己的网络服务器将数据存储在Web上

检查here示例和tuto

答案 5 :(得分:2)

  1. 共享偏好: android shared preferences example for high scores?

  2. 您的应用是否可以访问"外部存储媒体"。如果是,那么您只需将值(将其与时间戳存储在一起)写入文件并保存即可。时间戳将帮助您显示您正在寻找的内容。 {不是一个聪明的解决方案。}

答案 6 :(得分:1)

2021 答案

老问题,但在 2021 年,您可以使用多种方法来保存数据。

1.使用本地数据库 - 房间图书馆

Room 是一个库,可让您将数据存储在 Android 设备附带的内部 SqlLite 数据库中,它是一个本地数据库。这很简单而且非常强大。

https://developer.android.com/training/data-storage/room

2.使用远程数据库 - Firebase / 您自己的数据库实现

您可以在服务器上使用 Firebase 服务或您自己的数据库实现来远程存储您的数据,这样您就可以在多个设备上访问数据。

https://firebase.google.com/docs/firestore

3.存储本地文件

您可以将所有信息存储在保存在设备外部存储器中的本地文件中,可能使用带有 \n 作为数据分隔符的 .txt 文件。这个选项在 2021 年看起来真的是“穴居人”。

https://stackoverflow.com/a/14377185/14327871

4.使用 SharedPreferences

正如许多人指出的那样,您还可以使用 sharedPreferences 将少量信息存储为键值对,例如在跨会话保存用户首选项时非常有用。

https://developer.android.com/training/data-storage/shared-preferences?hl=en

对于 OP 情况,我建议使用第一个或第二个选项。

答案 7 :(得分:0)

在我看来,db4o是最简单的方法。 在这里你可以找到一个教程: http://community.versant.com/documentation/reference/db4o-7.12/java/tutorial/

在这里你可以下载这个库:

http://www.db4o.com/community/download.aspx?file=db4o-8.0-java.zip

(只需将lib目录中的db4o-8.0 ...- all-java5.jar放入项目的libs文件夹即可。 如果您的项目中没有libs文件夹,请创建它)

由于db4o是面向对象的数据库系统,因此您可以直接将对象保存到数据库中,然后将其恢复。

答案 8 :(得分:0)

请不要忘记一件事 - 卸载应用程序时会删除内部存储数据。在某些情况下,它可能是“意外的功能”。然后使用外部存储很好。

Google docs about storage - 请特别注意getExternalStoragePublicDirectory

答案 9 :(得分:0)

快速解答:

final int height = getContext().getResources().getDisplayMetrics().heightPixels;
final int oneThird = height/3;

params.height = oneThird;
water.setLayoutParams(params);

答案 10 :(得分:0)

使用此方法可以非常轻松地使用sharedPreferences。

private val sharedPreferences = context.getSharedPreferences("myPreferences", Context.MODE_PRIVATE)

fun put(key: String, value: String) = sharedPreferences.edit().putString(key, value).apply()

fun put(key: String, value: Int) = sharedPreferences.edit().putInt(key, value).apply()

fun put(key: String, value: Float) = sharedPreferences.edit().putFloat(key, value).apply()

fun put(key: String, value: Boolean) = sharedPreferences.edit().putBoolean(key, value).apply()

fun put(key: String, value: Long) = sharedPreferences.edit().putLong(key, value).apply()

fun getString(key: String, defaultValue: String? = null): String? = sharedPreferences.getString(key, defaultValue)

fun getInt(key: String, defaultValue: Int = -1): Int = sharedPreferences.getInt(key, defaultValue)

fun getFloat(key: String, defaultValue: Float = -1F): Float = sharedPreferences.getFloat(key, defaultValue)

fun getBoolean(key: String, defaultValue: Boolean = false): Boolean = sharedPreferences.getBoolean(key, defaultValue)

fun getLong(key: String, defaultValue: Long = -1L): Long = sharedPreferences.getLong(key, defaultValue)

fun clearAll() = sharedPreferences.edit().clear().apply()

将它们放入类并在其构造函数中获取上下文。

答案 11 :(得分:0)

您可以存储分数并轻松加载它们!使用这种方法 使用这个库Paper Db

在您的应用中添加此库:

implementation 'io.github.pilgr:paperdb:2.7.1'

然后在您存储的活动 onCreate() 中初始化一次:

Paper.init(context)

创建一个键来存储你的分数

int myScore=10;
Paper.book().write("scores", myScore);

并获取分数的值:

int mySavedScores=Paper.book().read("scores");

就是这样!!!现在即使应用程序关闭,您也可以保存和访问该值 并参考文档以获取更多方法和信息, 阅读文档是一个好习惯。