五大存储
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()
使用。
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?