五大存储

SharedPreference

适用范围保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),解锁口 令密码等

​ 核心原理保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息。通过DDMS的File Explorer面板,展开文件浏览树,很明显SharedPreferences数据总是存储在/data/data//shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。 SharedPreferences本身是一 个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例,该方法中name表示要操作的xml文件名,第二个参数具体如下:

Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写。

Context.MODE_WORLD_READABLE: 指定该SharedPreferences数据能被其他应用程序读,但不能写。

Context.MODE_WORLD_WRITEABLE: 指定该SharedPreferences数据能被其他应用程序读,写

Editor有如下主要重要方法:

SharedPreferences.Editor clear():清空SharedPreferences里所有数据

SharedPreferences.Editor putXxx(String key , xxx value): 向SharedPreferences存入指定key对应的数据,其中xxx 可以是boolean,float,int等各种基本类型据

SharedPreferences.Editor remove(): 删除SharedPreferences中指定key对应的数据项

boolean commit(): 当Editor编辑完成后,使用该方法提交修改

SQLite数据库存储

嵌入式数据库,可通过SQLiteOpenHelper.getWriteableDatabase获取实例,然后进行增删改查操作

ContentProvider

ContentProvider一般为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据。

之所以使用ContentProvider,主要有以下几个理由: 1,ContentProvider提供了对底层数据存储方式的抽象。比如下图中,底层使用了SQLite数据库,在用了ContentProvider封装后,即使你把数据库换成MongoDB,也不会对上层数据使用层代码产生影响。

2,Android框架中的一些类需要ContentProvider类型数据。如果你想让你的数据可以使用在如SyncAdapter, Loader, CursorAdapter等类上,那么你就需要为你的数据做一层ContentProvider封装。

3,第三个原因也是最主要的原因,是ContentProvider为应用间的数据交互提供了一个安全的环境。它准许你把自己的应用数据根据需求开放给其他应用进行增、删、改、查,而不用担心直接开放数据库权限而带来的安全问题。

ContentProvider进行增,删,改,查的操作使用ContentResolver

ContentResolver来统一管理与不同ContentProvider间的操作。

ContentProvider中的URI

ContentProvider中的URI有固定格式:

content://Authority/Path/Id

URI

Authority:

授权信息,用以区别不同的ContentProvider;

Path:

表名,用以区分ContentProvider中不同的数据表;

Id :

区分是哪一条数据

文件

context.getCacheDir()

存储应用私有缓存,当应用被卸载的时候,目录下的文件会被删除。

这个文件的目录和应用的存储位置有关, 当应用被移动到外部存储设备的时候,文件的绝对路径也是变化的,所以建议当数据存储到这个目录的时候,用相对路径。

这个目录和getFilesDir()目录最大的不同在于:当安卓设备的存储空间少,或者不够用的时候,系统会自动删除这个目录下的文件。官方建议是,超过1MB的文件,建议存储到getExternalCacheDir()目录下。

context.getExternalCacheDir()

存储应用私有缓存, 当应用被卸载的时候,目录下的文件会被删除。

只有手机系统使用的是虚拟外部存储(虚拟SD卡,现在绝大多数的手机,都不用外挂物理SD卡了)的时候, 才可以在卸载应用的同时,自动删除该目录下的文件,如果是之前的物理存储(物理SD卡)则不会自动删除该目录,及目录下的文件。

最好判断外部存储的挂载状态,结合context.getCacheDir()使用。

public String getDiskCacheDir(
    Context context) {
    String cachePath = null;
    if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !Environment
       .isExternalStorageRemovable()) {
        cachePath = context.getExternalCacheDir().getPath();
    } else { cachePath = context.getCacheDir().getPath(); }
    return cachePath;
}

context.getFilesDir()

存储应用私有文件,当应用被卸载的时候,目录下的文件会被删除。这个文件的目录和应用的存储位置有关, 当应用被移动到外部存储设备的时候,文件的绝对路径也是变化的,所以建议当数据存储到这个目录的时候,用相对路径。系统提供的访问此路径文件的方法是:context.openFileOutput(String,int);context.openFileInput(String name)。

context.getExternalFilesDir(dirType)

存储应用私有文件,当应用被卸载的时候,目录下的文件会被删除。只有手机系统使用的是虚拟外部存储(虚拟SD卡)的时候, 才可以在卸载应用的同时,自动删除该目录下的文件,如果是之前的物理存储(物理SD卡)则不会自动删除该目录,及目录下的文件。

Environment.getExternalStorageDirectory()

应用外部存储空间,数据文件可被系统和用户访问,会被手机系统检索。

该目录下读写文件,需要获取读写权限。

这个目录是用户进行操作的一个根目录,进入二级目录可以通过getExternalFilesDirs(String), getExternalCacheDirs(), getExternalMediaDirs().这些方法。

官方建议,不要直接使用该目录,为了避免污染用户的根命名空间,应用私有的数据,应该放在 Context.getExternalFilesDir目录下 其他的可以被分享的文件,可以放在getExternalStoragePublicDirectory(String).目录下。

Environment.getExternalStoragePublicDirectory(dirType)

应用外部公共存储空间。用来存放各种类型的文件,Environment提供了各种directory类型。

Android 10收紧了权限,Environment.getExternalStorageDirectory()和Environment.getExternalStoragePublicDirectory(dirType)被标记为废弃,需要通过MediaStore适配文件访问。

网络

Last updated

Was this helpful?