Android官方开发教程中文版(六)
- 格式:docx
- 大小:37.03 KB
- 文档页数:10
Android官方开发教程中文版 保存数据 保存数据 大部分Android应用都需要保存数据,即使只是在onPause()期间不让用户进度丢失而保存状态信息。大部分有意义的App还需要保存用户设置,某些App必须管理大量来自于文件和数据库的信息。本课程介绍Android中保存数据的主要方式。包括: 简单数据保存到参数文件中的键值对。 保存到Android文件系统的任意文件中。 使用SQLite数据库管理。
保存键值对集合 如果你有一个想保存的、相对较小的键值对集合,你应用使用SharedPreferences API。SharedPreferences对象指向一个包含了键值对的文件并提供一些简单的方法以读写它们。每个SharedPreferences文件由框架管理,可以设为私有或共享。 本课程展示如何使用SharedPreferences API储存相对简单的数据。 注意:SharedPreferences API只读写键值对,不要把它和Preference API混淆,Preference API是为App设置构建用户界面(尽管在界面中使用SharedPreferences API来做为保存设置数据的实现)。有关Preference的更多信息,请参见“设置”指南。
获取SharedPreferences的句柄 你可以创建新的参数文件或通过以下两个方法之一访问一个存在的参数文件: getSharedPreferences()——如果你需要从由名称标识的多个共享参数文件中,用方法的第一个参数指定一个,那么用这个。你可以从App的任意上下文中调用它。 getPreferences()——如果你需要为Activity使用仅有的参数文件,那么用这个。因为这会检索Activity默认的共享参数文件,你不需要提供名称。 例如,下面的代码在一个Fragment中执行,它访问了一个由资源字符串R.string.preference_file_key标识的参数文件,并且用私有模式打开它,因此这个文件只能由你的App访问。 Context context = getActivity(); SharedPreferences sharedPref = context.getSharedPreferences( getString(R.string.preference_file_key), Context.MODE_PRIVATE); 命名你的共享参数文件时,应该使用唯一的、可识别的名称。比如“com.example.myapp.PREFERENCE_FILE_KEY”。 或者,如果你的Activity就一个共享参数文件,你可以使用getPreference()方法: SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); 警告:如果你MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE创建共享参数文件,那么任何知道文件标识符的其它App都可以访问你的数据。 写入共享参数 写入共享参数文件,用SharedPreferences对象的edit()方法创建一个SharedPreference.Editor对象。 把你要写入的键和值传递给putInt()或putString()之类的方法,然后调用commit()方法提交改变。如: SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putInt(getString(R.string.saved_high_score), newHighScore); editor.commit();
读取共享参数 调用getInt()或getString()之类的方法从共享参数文件中检索值,提供一个你想要得到值的键,以及一个可选的、当键不存在时返回的默认值。如: SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); int defaultValue = getResources().getInteger(R.string.saved_high_score_default); long highScore = sharedPref.getInt(getString(R.string.saved_high_score), defaultValue);
保存文件 Android使用的文件系统类似其它平台上的基于磁盘的文件系统。本节内容描述了File API如何工作于Android文件系统以及读写文件。 File对象适合按从头到尾的、不跳过任何内容的顺序,读写大量数据。例如,图像文件或任何通过网络交换的数据。 本节内容展示了如何在你的App中执行文件相关的基本任务。本节课假设你熟悉基本的Linux文件系统以及Java.io中标准的文件输入输出API。
选择内部或外部存储 所有Android系统都有两个文件存储区:“内部”或“外部”。这些叫法来自早期Android,大部分Android设备提供了内建的、非易失性的存储器(内部储存),加上一个可移动的存储介质如微型SD卡(外部储存)。某些设备将永久储存空间划分为“内部”和“外部”分区,因此,就算没有可移动存储介质,也同样有两种存储空间和API行为,无论外部储存是否可移动。下表是对两种储存空间的总结: 内容存储: 总是可用的。 存放在这里的文件默认情况只能被你的App访问。 当用户卸载你的App时,系统会在内部存储中删除所有你的App的文件。 内部存储区最好用来存放你即不想让用户,也不想让其它App访问的文件。 外部存储: 不总是可用的,用户可以把外部存储器做为USB设备插入,也可以从设备上移除。 它是“全世界可读的”(公开的),文件存放在这里会在你控制之外被读取。 当用户卸载你的App时,只有保存在通过getExternalFilesDir()方法获得的目录中的App文件才会被系统删除。 外部存储区最好用来存放不需要限制访问,或是你想共享给其它App,或是允许用户通过电脑来访问的文件。 提示:虽然App默认情况下是安装在内部存储区的,但你可以在清单文件中指定android:installLocation属性让你的App安装在外部存储区上。用户会喜欢这个选项的,当APK的大小非常大,而用户有一个比内部存储区大得多的外部存储区时。详情请参考“应用安装位置”。
获得外部存储区权限 要写入外部存储区,你必须在清单文件中请求WRITE_EXTERNAL_STORAGE权限: ... 警告:目前,所有的App都可以读取外部存储区而不需要指定权限。无论如何,这将在未来的版本中改变。如果你的App需要读取外部存储区(但不写入),你需要声明READ_EXTERNAL_STORAGE权限。要确保你的应用如期望中的那样继续工作,在更改生效之前,你应该立即声明这个权限。 把文件保存到内部存储区中不需要任何权限,应用程序任何时候在自己的内部存储区目录中都有权限读写文件。
把文件保存到内部存储区 当把文件保存到内部存储区时,你可以通过下列两个方法之一获得文件对应的目录: getFilesDir() 为App返回表示内部目录的文件对象 getCacheDir() 为App的临时缓存文件返回表示内部目录的文件对象。确保文件不再使用时删除它,并且在任何时候都为它执行一个合理的大小限制,比如1MB。如果系统检查到存储空间过低,它会删除你的缓存文件而不做任何警告。
在这些目录中创建新的文件,你可以使用File()构造函数,传递通过上面的方法之一提供的,指定了内部存储目录的文件对象。如: File file = new File(context.getFilesDir(), filename); 或者,你也可以调用openFileOutput()获得一个FileOutputStream来写入到你的内部目录中的文件。如: String filename = "myfile"; String string = "Hello world!"; FileOutputStream outputStream;
try { outputStream = openFileOutput(filename, Context.MODE_PRIVATE); outputStream.write(string.getBytes()); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } 又或者,如果你需要缓存某些文件,你应该使用createTempFile()。下例中的方法从URL