如何在android应用程序中保存数据
我最近编写了一个Android应用程序。 这只是一个简单的应用程序,可以让你用一些简单的计数器间隔保持篮球比赛的得分。 我需要添加一个保存function,所以你可以保存你的分数,然后加载它们。 目前,当你停止应用程序,你的数据丢失。 所以我想知道的是我不得不添加到应用程序保存一个标签(分数),然后加载它备份。 谢谢你们对不起,我不太了解这个东西。
你有两个select,我会把select留给你。
-
共享首选项
这是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);
-
内部存储器
这在我看来就是你可能要找的东西。 你可以存储任何你想要的文件,所以这给你更多的灵活性。 然而,这个过程可能会更棘手,因为所有的东西都会以字节的forms存储,这意味着你必须小心地保持你的读写过程一起工作。
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();
现在,您也可以查看“ 外部存储” ,但我不build议在这种情况下,因为外部存储可能不在那里。 (请注意,如果你select这个,需要许可)
OP是要求一个“保存”function,这不仅仅是保存数据执行的程序(你必须做的应用程序是值得的任何东西)。
我build议将数据保存在SD卡上的一个文件中,以便以后不仅可以重新调用它,而且允许用户将设备作为外部驱动器安装在自己的计算机上,并抓取数据在其他地方使用。
所以你真的需要一个多点系统:
1)实现onSaveInstanceState()
。 在这个方法中,你传递了一个Bundle,它基本上就像一个字典。 在捆绑包中存储尽可能多的信息,以重新启动应用程序。 在你的onCreate()
方法中,检查传入的包是否为空,如果是,则从包中恢复状态。
2)实现onPause()
。 在这种方法中,创build一个SharedPreferences编辑器,并使用它来保存下次启动应用程序所需的任何状态。 这主要包括用户的喜好(因此,名称),但其他任何相关的应用程序的启动状态也应该在这里。 我不会在这里存储分数,只是你需要重新启动应用程序的东西。 然后,在onCreate()
,只要没有bundle对象,使用SharedPreferences接口来调用这些设置。
3a)至于分数这样的事情,你可以按照Mathias的build议,将分数存储在getFilesDir()
返回的目录中,使用openFileOutput()
等。我认为这个目录是应用程序私有的,并且存在于主存储器中,意思是其他应用程序和用户将无法访问数据。 如果这对你有好处,那么这可能是要走的路。
3b)如果你想要其他的应用程序或者用户直接访问数据,或者数据量非常大,那么SD卡是最好的select。 select一个类似com / user1446371 / basketballapp /的目录名称,以避免与其他应用程序发生冲突(除非您确定您的应用程序名称是合理唯一的),并在SD卡上创build该目录。 正如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
我build议为您的数据简单的CSV文件,以便其他应用程序可以轻松地阅读它们。
显然,你必须编写允许“保存”和“打开”对话框的活动。 我通常只是打电话给openintnts文件pipe理器,让它做的工作。 这要求您的用户安装openintents文件pipe理器来使用这些function。
在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();
使用SharedPreferences, http://developer.android.com/reference/android/content/SharedPreferences.html
以下是一个示例: http : //developer.android.com/guide/topics/data/data-storage.html#pref
如果数据结构更复杂或数据量较大,请使用Sqlite数据库; 但对于less量的数据和一个非常简单的数据结构,我会说,SharedPrefs将会做,而数据库可能会开销。
有很多选项来存储您的数据和Android提供您select任何人您的数据存储选项如下:
共享首选项将私有原始数据存储在键值对中。 内部存储将私人数据存储在设备内存上。 外部存储将公共数据存储在共享的外部存储上。 SQLite数据库将结构化数据存储在私有数据库中。 networking连接使用您自己的networking服务器将数据存储在networking上
检查这里的例子和tuto
-
共享首选项: android共享首选项高分的例子?
-
您的应用程序是否可以访问“外部存储介质”? 如果这样做,那么你可以简单地写入值(存储时间戳)在一个文件中并保存。 时间戳将帮助你显示进度,如果这就是你在找什么。 {不是一个聪明的解决scheme。}
在我看来,db4o是最简单的方法。 在这里你可以find一个教程: 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文件夹就创build它)
由于db4o是一个面向对象的数据库系统,您可以直接将对象保存到数据库中,然后再将其取回。
请不要忘记一件事 – 卸载应用程序时,内部存储数据将被删除。 在某些情况下,它可能是“意想不到的function”。 那么使用外部存储是很好的。
有关存储的Google文档 – 请特别注意getExternalStoragePublicDirectory