数据存储方式:一道面试题引发的血案

转载请注明原创出处,谢谢!
  • GitHub: @Ricco

由于面试的挫折,感悟众多,今天写我的第二道面试题。

  • 面试官:聊聊Android数据存储的方式!
  • 我的内心世界:基础问题,SharedPreferences,File,SQLite,ContentProvider,网络。这题虽然简单,但不能全说,例如SharedPreferences的优化,SP使用不当,会导致App卡顿,乃至ANR问题。File如何选择合适的流,等等,如果回答的太细,会把自己聊死,为了避免尴尬,回答简单了一点。我不建议详细回答面试官提问的基础问题,比如四大组件,回答上来,没有任何加分,回答不上来,会大大扣分
  • 我的回答:五种存储方式,巴拉巴拉。。。。。但没提太多。主要是怕面试官刨根问底。
    其中我还提到了OrmLite和郭霖大神的LitePal,网络存储提到了Bmob和七牛什么的。不得不说我的计谋成功了,接下来面试官顺着我开始聊,Handler、AsyncTask、OkHttp,但是说实话,我玩Android2年,用过Handler、AsyncTask加起来的次数,绝对不超过10次,OkHttp多一点,但绝对不超过50次。可能是没写过企业项目吧,这没招。。。

开始写技术

  • 今天写数据存储,下一篇写Handler、AsyncTask、OkHttp。

Android 中的数据存储概述?

* Android 中的UI的作用是什么?
  * 通过View呈现数据
  * 实现于用户的交互
* Android 中的数据来源?
  * 内存(数据断电(重启,关机)则丢失)
  * 外存(数据可以持久保存在手机的sdcard)
  * 网络(数据可以持久存储在云端、服务器)
* **Android 中的数据格式?**
  * 非结构化数据(图片、音频、视频、普通文本···)
  * 半结构化数据(xml)
  * 结构化数据(数据库以二维表的形式对数据进行存储:SQLite)
    **Android 中会结合数据特点采用不同的数据读写方式**
* Android 中的数据存储类型?
  * 直接I/O存储(直接以I/O流的形式对数据进行存储)
  * 偏好设置存储(以键值对Key/Value信息的形式对数据进行存储)
  * SQLite存储(以二维表的形式进行存储)

Android 中的外部存储?

* Android 外部存储概述?
  * Android外部存储一般指外置sdcard的数据存储,外部存储的文件一般比较大,例如图片、视频、音乐···
  * 而且大多数是非结构化数据.
* Android 外部存储的数据权限?
    * 共有数据(一般指所有App都可以访问到的数据)
    * 私有数据(一般指本App内部对象可以访问的数据)必须添加权限
* **Android 外部存储应用的实现及相关API?**
    * 相关步骤

获取外置sdcard的存储状态(是否有可用的sdcard)
获取sdcard的存储目录
设置读写sdcard的权限(假如是私有数据必须设置)
获取外置sdcard的空间大小(尤其是对写的动作)
通过I/O流的方式直接读写sdcard.
* 相关API
1)Environment(状态,共有目录)

isExternalStorageRemovable()
getExternalStorageDirectory()
getExternalStoragePublicDirectory()
    2)Context(应用私有目录)
getExternalStorageDirectory()
getExternalStoragePublicDirectory()
    3)StatFs(目录控件大小)
getBlockCount()
getFreeBlocks()
getAvailableBlocks()
getBlosckSize()
    4)I/O(直接读写数据)
  • Android 中的内部直接I/O存储实现步骤及相关API?
    • 相关步骤

获得内部存储目录(data/data/项目包/...)
获得目录空间大小(是否有足够空间可以存储我们的数据)
直接I/O读写数据?(数据为应用程序私有数据)
* 相关API
1)Context

getFilesDir()
getCacheDir()
openFileOutput()
openFileInput()

2)StatFs
3)I/O
说明:内部存储数据在应用卸载是会被删除。

  • Android 中内部存储中的偏好设置存储的实现步骤及相关API?
    • 概述
      偏好设置存储以Key/Value形式对用户的一些行为信息,系统的状态进行相关记录(例如记住用户手机号,密码···)
    • 步骤(写数据)

获得SharedPreferences对象
获得Editor对象(负责编辑,假如是读数据不需要获得此对象)
通过Editor方法存储数据(暂时存在内存)
通过Editor对象的commit方法持久化数据(将数据写到外存)
* 相关API

Context(通过此对象获得SharedPreferences对象)
SharedPreferences(通过此对象获得数据或者获得Editor对象)
Editor(通过此对象实现对数据的编辑操作)
  • Android 内部存储中的SQLite存储的实现步骤及相关API?
    • 概述
      SQLite本身是一个开源数据库系统DBMS(Database),底层借助C/C++实现,体积非常小,非常时候于一些便携式设置,在Android和IOS系统中读默认集成了这样的一个数据库系统。
      SQLite实现了对Android系统中结构化数据的更好存储,保证了数据的安全、稳定、高效。
    • 步骤

创建或打开数据库
创建对应表(假如表不存在)
操作表中的数据(insert,update,delete,select)
释放数据库资源(释放内存)
* 相关API

Context
SQliteDatabase,SqliteOpenHelper,Cursor,SimpleCursorAdapter,...
SQL(结构化程序语言):DML,DDL,DCL
    DML(数据操纵语言)
    DDL(数据定义语言)
    DCL(数据控制语言)

最后唠叨

ContentProvider实在是没用过,写不出半点东西来,网络要写的话,太大,写不了,而且也不是太熟悉。
其实我想吐槽一下,哪个神经病给Android弄的三级缓存???还分为内存,文件,网络,你开发的是百度云盘还是WPS Office啊,网络这部分不是我们这些小渣渣应该考虑的事情,很多公司应该没哪个实力。
小心OOM,小心OOM,小心OOM

你可能感兴趣的:(数据存储方式:一道面试题引发的血案)