转载请注明原创出处,谢谢!
- 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
网友评论