面试准备-打卡第六天-Android篇

335 阅读3分钟

Android中的持久化存储方式及其应用场景是什么?

  • SharedPreferences 采用键值对的方式进行存储。同时,支持多种不同的数据类型存储。 默认存储在data/data/package name/shared_prefs/目录下。操作模式目前只有MODE_PRIVATE一种模式。其值为0,表示只有当前程序才可以对这个文件进行读写。其余几种操作模式已经被废弃。默认是没有考虑同步互斥,它基于单个文件,不支持多进程。在getSharedPreferences的时候,会强制让SharedPreferences进行一次读取操作,从而保证数据是最新的。是轻量级的存储类,特别适合用于保存软件配置参数。

    • 优点:
    1. 轻量级,以键值对的方式进行存储,使用方便,易于理解;
    2. 采用的是xml文件形式存储在本地,程序卸载后会也会一并被清除,不会残留信息;
    • 缺点:
    1. 由于对文件IO读取,每次进行getSharedPreferences和commit时都要将数据从内存写入到文件中,或从文件中读取
    2. 多线程场景下效率比较低,在getSharedPreferences操作时,会锁定SharedPreferences对象,互斥其他操作,而当put、commint时,会锁定Editor对象,使用写入锁进行互斥,在这种情况下,效率会降低
    3. 不支持跨进程通讯
    4. 由于每次都会把整个文件加载到内存中,因此,如果SharedPreferences文件过大,或者在其中的键值对时大对象的json数据则会占用大量内存,读取速度慢是一方面,同时也会引发程序频繁GC,导致的界面卡顿
  • 文件存储 在Context类中提供了openFileOutput和openFileInput的方法,可以存储和读取指定的文件中的数据,默认文件存储在data/data/package name/files/目录下,故而只需要指定文件名即可,文件操作模式有MODE_PRIVATEMODE_APPEND两种可选,属于程序私有目录下存储和读取,不需要读写权限,永久存储,即使应用被卸载,存储的数据依然存在

  • SQLite数据库 存储路径:(data/data/packagename/databases),一种嵌入式数据库,支持sql语言,存储大量结构性数据

Android中为管理数据库提供了SQLiteOpenHelper,这个类是一个抽象类,我们使用需要继承它,然后重写里面的对应方法onCreateonUpgrade

  • ContentProvider 进程(应用程序)间数据共享,数据源可以是sqlite,也可以是xml,相关类;
  • 网络存储 天气数据的xml,json格式等等,通过HTTPUrlConnection,HttpClient等获取数据

获取SharedPreferences对象的方式?

在Android中提供了两种方式来获取SharedPreferences对象:

  • Context类中的getSharedPreferences()方法
  • Activity类中的getPreferences()方法

在SharedPreference中提交数据有哪些方式?有什么区别?

在SharedPreference中提交数据有两种方式,分别是apply和commint

SharedPreference相关修改使用apply方法进行提交会先写入内存,然后异步写入磁盘,commint是直接写入磁盘,如果频繁操作的话,apply性能会优于commint,apply会将最后修改内容写入磁盘,但是如果希望立刻获取存储操作的结果,并据此作出相应的其他操作,应当使用commint

  1. commit和apply虽然都是原子性操作,但是原子的操作不同,commit是原子提交到数据库,所以从提交数据到存在Disk中都是同步过程,中间不可打断。
  2. 而apply方法的原子操作是原子提交的内存中,而非数据库,所以在提交到内存中时不可打断,之后再异步提交数据到数据库中,因此也不会有相应的返回值。
  3. 所有commit提交是同步过程,效率会比apply异步提交的速度慢,但是apply没有返回值(commit会返回一个boolean值),永远无法知道存储是否失败。
  4. 在不关心提交结果是否成功的情况下,优先考虑apply方法。