数据存储
在数据库,文件,或偏好,内部或可移动存储存储应用程序数据。您还可以添加一个数据备份服务,让用户存储和恢复的应用程序和系统数据。
存储选项
训练
同步到云

本课程涵盖了云计算功能的应用不同的策略。它涵盖了同步数据和使用云自己的后端的Web应用程序,并使用云,这样一个新的设备上安装应用程序时,用户可以恢复他们的数据备份数据。

存储选项

Android提供了几个选项,为您节省持久应用程序数据。您选择的解决方案取决于您的特定需求,如数据是否应该是私有的应用程序或访问其他应用程序(和用户),并多少空间您的数据需要。


您的数据存储选项如下:


Shared Preferences
存储在键值对私人的基本数据。
Internal Storage
存储在设备内存的私人数据。
External Storage
存储在共享外部存储公共数据。
SQLite Databases
在专用数据库存储结构化数据。
Network Connection
用自己的网络服务器在网络上存储数据。
Android提供了一个方法可以让你即使您的私人数据暴露给其他应用程序 - 与内容提供商。内容提供商是一个可选组件,公开读给你的应用程序数据/写访问,受要强加任何限制。有关使用内容提供商的更多信息,请参阅内容提供商的文档。


使用Shared Preferences


该SharedPreferences类提供了一个总体框架,使您可以保存和检索的原始数据类型的持久键 - 值对。您可以使用SharedPreferences保存任何基本数据:布尔型,浮点数,整型,长整型和字符串。该数据将在用户会话持久(即使你的应用程序被杀害)。


用户首选项


共享偏好不严格用于保存“用户首选项”,比如什么铃声用户选择。如果您有兴趣为应用程序创建用户喜好,看PreferenceActivity,它提供了一个框架的活动,为您创建用户喜好,这将是自动持久(使用共享喜好)。
要获得SharedPreferences对象为你的应用程序,使用以下两种方法之一:


getSharedPreferences() - 如果你需要通过名称标识多个首选项文件,你的第一个参数指定使用此。
的getPreferences() - 如果你只需要一个为你的活动喜好文件中使用此。因为这将是唯一的喜好提交您的活动,你不提供一个名称。
写值:


调用编辑()得到一个SharedPreferences.Editor。
与方法,如putBoolean()和putString添加值()。
提交与提交新的值()
要读取值,使用SharedPreferences等方法getBoolean()和GetString()。


这里是保存在一个计算器按键静音模式下的偏好的例子:

public class Calc extends Activity {  public static final String PREFS_NAME = "MyPrefsFile";  @Override  protected void onCreate(Bundle state){   super.onCreate(state);   . . .   // Restore preferences   SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);   boolean silent = settings.getBoolean("silentMode", false);   setSilent(silent);  }  @Override  protected void onStop(){   super.onStop();   // We need an Editor object to make preference changes.   // All objects are from android.context.Context   SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);   SharedPreferences.Editor editor = settings.edit();   editor.putBoolean("silentMode", mSilentMode);   // Commit the edits!   editor.commit();  }}
使用内部存储


您可以直接在设备的内部存储保存文件。默认情况下,保存到内部存储文件是私有的应用程序和其他应用程序无法访问它们(也可以在用户)。当用户卸载应用程序,这些文件将被删除。


要创建并写入一个私人文件到内部存储:


与该文件的名称和操作模式调用openFileOutput()。这将返回一个FileOutputStream。
写与写文件()。
接近关闭流()。
例如:

String FILENAME = "hello_file";String string = "hello world!";FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);fos.write(string.getBytes());fos.close();
MODE_PRIVATE将创建文件(或替换同名的文件),并使其专用于您的应用程序。其他可用的模式有:MODE_APPEND,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE。


读取内部存储的文件:


呼叫openFileInput(),并通过它来读取文件的名称。这将返回一个FileInputStream。
读取从文件中读取字节()。
然后紧密关闭流()。
提示:如果您想保存在编译时在应用程序中的静态文件,将文件保存在您的项目RES /生/目录下。你可以用openRawResource()打开它,传递R.raw。<文件名>资源ID。此方法返回可用于读取该文件(但不能写入原始文件)一个InputStream。


保存缓存文件


如果您想缓存一些数据,而不是存储它坚持,你应该使用getCacheDir()打开表示内部目录,应用程序应该保存临时缓存文件的文件。


当设备处于低内部存储空间,Android版可能会删除这些缓存文件来​​恢复空间。但是,你不应该依靠制度来清理这些文件给你。你应该始终保持缓存文件自己,保持消费的空间合理的限度,如1MB以内。当用户卸载应用程序,这些文件将被删除。


其他有用的方法


getFilesDir()
获取到您的内部文件都保存在文件系统目录的绝对路径。
GETDIR()
创建(或打开现有)的内部存储空间中的目录。
deleteFile()
删除保存在内部存储的文件。
fileList()
返回当前由应用程序保存的文件的数组。
使用外部存储


每一个Android兼容的设备支持共享“外部存储”,你可以用它来保存文件。这可以是一个可移动的存储介质(如SD卡)或内部(不可移动)的存储。保存到外部存储器中的文件是世界可读和可以由用户当它们使USB大容量存储到计算机上传输文件进行修改。


注意:如果用户安装外部存储在计算机上或删除媒体,而且也没有安全性的文件时您保存到外部存储器执行外部存储设备变得不可用。所有的应用程序可以读写放置在外部存储器中的文件,并且用户可以将其删除。


获得访问外部存储


为了在外部存储读取或写入文件,应用程序必须获得READ_EXTERNAL_STORAG​​E或WRITE_EXTERNAL_STORAG​​E系统权限。例如:

<manifest ...>  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  ...</manifest>
如果您需要同时读取和写入文件,则需要请求只有WRITE_EXTERNAL_STORAGE权限,因为它隐含需要读取访问以及。


注:与Android4.4开始,如果你正在读或写只属于私有您的应用程序文件,这些权限不是必需的。欲了解更多信息,请参见下面关于拯救那些应用程序专用文件的部分。


检查媒体的可用性


在你做与外部存储的任何工作,你应该总是调用getExternalStorageState()检查介质是否可用。介质可能被安装到计算机,缺失,只读,或在一些其它状态。例如,在这里,你可以使用它来检查可用性的夫妇的方法:

/* Checks if external storage is available for read and write */public boolean isExternalStorageWritable() {  String state = Environment.getExternalStorageState();  if (Environment.MEDIA_MOUNTED.equals(state)) {    return true;  }  return false;}/* Checks if external storage is available to at least read */public boolean isExternalStorageReadable() {  String state = Environment.getExternalStorageState();  if (Environment.MEDIA_MOUNTED.equals(state) ||    Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {    return true;  }  return false;}
该getExternalStorageState()方法返回,你可能要检查其他国家,如媒体是否被共享(连接到计算机),完全丢失,已删除严重,等等。你可以使用这些与通知用户当你的应用程序需要访问媒体的更多信息。


可以与其他应用程序共享文件的保存


从媒体扫描隐藏文件


包括一个空文件在外部文件目录下名为.nomedia(注意文件名中的点前缀)。这可以防止介质的扫描仪读取媒体文件,并通过MediaStore内容提供商把它们提供给其他应用程序。但是,如果你的文件是真正专用于您的应用程序,你应该将它们保存在一个应用程序,私有目录。
通常,用户可以通过你的应用程序获得新的文件保存到设备上的“公共”位置,其他应用程序可以访问它们,用户可以将它们从设备上轻松复制。这样做时,你应该使用共享的公共目录,如音乐/,图片/和铃声/之一。


为了得到较适当的公共目录文件,调用getExternalStoragePublicDirectory(),传递你想要的目录的类型,如DIRECTORY_MUSIC,DIRECTORY_PICTURES,DIRECTORY_RINGTONES,或其他人。通过将文件保存到相应的媒体类型目录,系统的媒体扫描仪可以适当分类系统中的文件(例如,手机铃声会出现在系统中设置为铃声,而不是音乐)。


例如,下面是创建在公开的图片目录中的一个新相册目录的方法:

public File getAlbumStorageDir(String albumName) {  // Get the directory for the user's public pictures directory.  File file = new File(Environment.getExternalStoragePublicDirectory(      Environment.DIRECTORY_PICTURES), albumName);  if (!file.mkdirs()) {    Log.e(LOG_TAG, "Directory not created");  }  return file;}
节约是应用程序专用文件。
如果您正在处理未用于其他应用程序使用的文件(如图形纹理或仅由你的应用程序中使用声音效果),你应该调用getExternalFilesDir使用上的外部存储专用存储目录()。此方法还需要一个类型参数来指定子目录的类型(如目录MOVIES)。如果你并不需要一个特定的媒体目录,传递null收到您的应用程序的私有目录的根目录。
与Android4.4开始,阅读或在应用程序的私有目录中写入文件不需要READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限。所以,你可以声明许可只能由添加的minSdkVersion属性较低的Android版本的请求

<manifest ...>  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"          android:maxSdkVersion="18" />  ...</manifest>
注意:当用户卸载应用程序,这个目录及其所有内容将被删除。此外,系统的介质扫描仪没有在这些目录读取文件,所以它们不从MediaStore内容提供商访问。因此,你不应该使用这些目录的媒体,最终属于用户,如捕获或与您的应用程序,或音乐的用户与您购买的编辑照片的应用程序,这些文件应该被保存在公共目录。


有时,已分配的内部存储器的分区用作外部存储装置还可以提供一个SD卡插槽。当这样的设备运行的是Android 4.3以下时,getExternalFilesDir()方法提供只能访问内部的分区,你的应用程序无法读取或写入SD卡。与Android 4.4开始,但是,您可以通过调用getExternalFilesDirs(),它返回条目每个位置的文件数组来访问这两个位置。数组中的第一项被认为是主要外部存储,除非它的全部或不可用时,你应该使用的位置。如果您想访问这两个可能的位置,同时还支持Android 4.3及更低,使用支持库的静态方法,ContextCompat.getExternalFilesDirs()。这也返回一个文件数组,但总是只包括一个在Android 4.3和更低的入门。


注意事项虽然getExternalFilesDir()和getExternalFilesDirs()提供的目录是不是由MediaStore内容提供商访问,其他应用程序的权限READ_EXTERNAL_STORAG​​E可以访问外部存储,包括这些所有文件。如果您需要完全限制你的文件的访问,您应该写你的文件到内部存储。


保存缓存文件


打开表示外部存储目录,你应该保存缓存文件文件,调用getExternalCacheDir()。如果用户卸载应用程序,这些文件会被自动删除。


类似ContextCompat.getExternalFilesDirs(),上面提到的,你也可以访问缓存目录上的辅助外部存储(如果可用)致电ContextCompat.getExternalCacheDirs()。


提示:要保存文件空间和维护应用程序的性能,您仔细管理你的缓存文件并删除那些没有在您的应用程序的生命周期不再需要是很重要的。


使用数据库


Android提供了SQLite数据库的全面支持。您创建的任何数据库将通过名称来访问应用程序中的任何类,而不是应用程序之外。


推荐的方法来创建一个新的SQLite数据库是创建SQLiteOpenHelper的子类,并重写onCreate()方法,您可以在其中执行SQLite的命令来创建数据库中的表。例如

public class DictionaryOpenHelper extends SQLiteOpenHelper {  private static final int DATABASE_VERSION = 2;  private static final String DICTIONARY_TABLE_NAME = "dictionary";  private static final String DICTIONARY_TABLE_CREATE =        "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +        KEY_WORD + " TEXT, " +        KEY_DEFINITION + " TEXT);";  DictionaryOpenHelper(Context context) {    super(context, DATABASE_NAME, null, DATABASE_VERSION);  }  @Override  public void onCreate(SQLiteDatabase db) {    db.execSQL(DICTIONARY_TABLE_CREATE);  }}
然后,您可以使用您所定义的构造让您SQLiteOpenHelper实现的实例。要写入,并从数据库中读取,调用getWritableDatabase()和getReadableDatabase(),分别为。这些均返回表示数据库,并提供了SQLite的操作方法SQLiteDatabase对象。
Android不征收超标准SQLite的概念,任何限制。我们建议包括可以作为一个唯一的ID可以迅速找到记录的自动增量值键字段。这不是必需的私人数据,但如果你实现一个内容提供商,必须包括使用BaseColumns._ID常数的唯一ID。
可以执行使用SQLiteDatabase查询()方法,它接受各种查询参数,如表查询,凸起,选择,列,分组和其他的SQLite查询。对于复杂的查询,比如那些需要列别名,你应该使用SQLiteQueryBuilder,这为建立查询几个方便的方法。
每个SQLite的查询将返回一个指向查询所找到的所有行的光标。光标总是带着你可以从一个数据库查询结果浏览和阅读的行和列的机制。
对于演示如何在Android中使用SQLite数据库示例应用程序,看到笔记本和检索字典应用程序。
数据库调试
Android SDK中包含一个sqlite3的数据库工具,允许您浏览表的内容,运行SQL命令,并在SQLite数据库执行其它有用的功能。请参阅从远程shell检查sqlite3的数据库,以了解如何运行此工具。
使用网络连接
您可以使用网络(如果有的话)来存储和检索数据对自己的基于web的服务。做网络业务,在下面的包使用的类:
java.net。*
android.net *。

更多相关文章

  1. Android客户端请求服务端资源(HttpURLConnection和输入流实现)
  2. Android最佳实践(八)之热修复方案
  3. Android文件命名规范初版
  4. Android(安卓)报错 - 无法解析类型 java.lang.Object。从必需的
  5. Android(安卓)修改应用程序字体
  6. 9.5.3 Android(安卓)Apk 反编译 & 9.5.4 Android(安卓)Apk 加密
  7. 动态化部署:Android热修复之代码修复(一)
  8. 借腾讯开源 VasDolly,谈谈 Android(安卓)签名和多渠道打包的原理!
  9. Android(安卓)使用模板生成Word文档,支持手机直接查看word

随机推荐

  1. Android自定义View底部连续圆环效果
  2. Android中RecyclerView的item中控件的点
  3. Android Studio精彩案例(五)《JSMS短信验
  4. Android模拟器调试html5 app
  5. Android studio 升级2.2 之后 Maven插件
  6. [置顶] Android Studio、eclipse
  7. Android特效专辑(十二)——仿支付宝咻一咻
  8. EventBus的使用,注意事项,错误分析
  9. AIDL详解2——复杂数据通信
  10. 自定义快速滚动条FastScrollBar