Android基础篇 Android 数据存储与性能
文章目录
- 前言
- 有关Android存储
- SharedPreferences 共享首选项
- 静态变量存储方式
- 到底使用哪一种存储方式?
- 文件存储方式(实战工具类)
- 数据库存储方式(实战工具类)
前言
最近到了一家公司,跟一个同事做项目,比如常规的一些操作用SharedPreferences就很好搞定,他跟我说SharedPreferences 会影响性能说了一堆… 难道别的存储方式就不耗费性能吗?不消耗内存吗?
有关Android存储
Android中的数据存储方案主要有:共享首选项(SharedPreferences)、内部存储(Internal Storage)、外部存储(External Storage)、SQLite数据库、 网络存储 静态变量等
SharedPreferences 共享首选项
先说一下SharedPreferences 简称SP , SharedPreferences类提供了一个通用框架,使开发者能够以键值对的方式,永久性的保存一些原始数据类型的数据,包括:布尔值,浮点值,整型值,长整型和字符串,被保存的数据可以跨多个用户会话永久保留(即使应用已经终止)。
为什么使用 SP 它的优点是什么? 使用SP 为Android开发者提供了更为便利的存储方式,但是相对的他也是有一些缺点的。
当我们首次创建 SharedPreferences 对象时,会根据文件名将文件下内容一次性加载到 mMap(SharedPreferencesImpl 成员) 容器中,每当我们 edit 都会创建一个新的 EditorImpl 对象,当修改或者添加数据时会将数据添加到 mModifiled (EditorImpl 成员)容器中,然后 commit 或 apply 操作比较 mMap 与 mModifiled 数据修正 mMap 中最后一次提交数据,然后写入到文件中。而 get 直接从 mMap 中读取。试想如果此时你存储了一些大型 key 或 value 它们会一直存储在内存中得不到释放。
(1) 不要存放大的 key 和 value 在 SharedPreferences 中,否则会一直存储在内存中得不到释放,内存使用过高会频发引发GC,导致界面丢帧甚至ANR (2) 不相关的配置选项最好不要放在一起,单个文件越大读取速度则越慢。 (3) 读取频繁的 key 和不频繁的 key 尽量不要放在一起(如果整个文件本身就较小则忽略,为了这点性能添加维护得不偿失)。 (4) 尽量不要存放 JSON 和 HTML,这种可以直接文件缓存。Json/HTML 文件较小忽略不计! (5) 不要指望这货能够跨进程通信 Context.PROCESS
静态变量存储方式
因为这种方式我与我一个同事有了一些意见不一的地方,他喜欢使用静态变量。现在的开发是针对于设备开发,而并非手机app的开发,如果app开发他的那种搞法非得出现问题不可。 因为Activity初始化的静态变量也会被置空,因此它的生命周期是不稳定的。也就是说,在Android中静态变量可能随时被系统置空,变为null,其它地方在使用的时候就会产生空指针现象
在Android开发中不提倡过多使用static类型的变量(除了 static final)因为静态变量生命周期较长,而且不易被系统回收,因此如果不能合理地使用静态变量,就会适得其反,造成大量的内存浪费,所谓过犹不及。 经过我的多方查证 建议在具备下列全部条件的情况下,尽量使用静态变量: (1) 变量所包含的对象体积较大,占用内存较多。 (2) 变量所包含的对象生命周期较长。 (3) 变量所包含的对象数据稳定。 (4) 该类的对象实例有对该变量所包含的对象的共享需求。 如果变量不具备上述特点建议你不要轻易地使用静态变量,以免弄巧成拙。 对于全局变量使用Android提供了 Application 其生命周期与应用程序共存亡。所以对于全局变量可以写在 Application。
到底使用哪一种存储方式?
(1) 如果是简单的数据结构,首选 SharedPreferences (2) 如果是数据量大处理复杂的话,首选是sql数据库 对于结构化的数据,一定要使用数据库,虽然会显得比较麻烦,但是后续的使用中会获益无穷 (3) 普通文件就是指文本文件,二进制文件,多媒体文件,还有频繁的读取要是用二进制文件。 (4) 使用网络存储时要避免传输大数据量数据,应注意对网络传输方式的优化(减少请求次数等)。
文件存储方式(实战工具类)
文件存储方式工具类
数据库存储方式(实战工具类)
数据库最近学会的是一个DAO 简直爱死这个了,处理数据库数据是真的轻松。
示例:
public class DbController {/*** Helper*/private DaoMaster.DevOpenHelper mHelper;/*** 数据库*/private SQLiteDatabase db;/*** DaoMaster*/private DaoMaster mDaoMaster;/*** DaoSession*/private DaoSession mDaoSession;/*** 上下文*/private Context context;private static DbController mDbController;/*** dao*/private StudentsDao studentsDao;/*** 获取单例*/public static DbController getInstance(Context context) {if (mDbController == null) {synchronized (DbController.class) {if (mDbController == null) {mDbController = new DbController(context);}}}return mDbController;}/*** 初始化** @param context*/public DbController(Context context) {this.context = context;mHelper = new DaoMaster.DevOpenHelper(context, "person.db", null);mDaoMaster = new DaoMaster(getWritableDatabase());mDaoSession = mDaoMaster.newSession();studentsDao = mDaoSession.getStudentsDao();// diningRoomDao = mDaoSession.getDiningRoomDao();}/*** 获取可写数据库** @return*/private SQLiteDatabase getWritableDatabase() {if (mHelper == null) {mHelper = new DaoMaster.DevOpenHelper(context, "person.db", null);}SQLiteDatabase db = mHelper.getWritableDatabase();return db;}public boolean execSQL(String sql) {if (db == null) {db = getWritableDatabase();}try {db.execSQL(sql);return true;} catch (SQLException s) {Log.e("SQLException", s.getMessage());return false;}}/*** 插入学生数据** @param*/public void insertStudents(Students studentsData) {studentsDao.insertOrReplace(studentsData);}/*** 批量插入学生数据*/public void saveStudentLists(final List<StudentBean> list) {if (list == null || list.isEmpty()) {return;}studentsDao.getSession().runInTx(new Runnable() {@Overridepublic void run() {for (int i = 0; i < list.size(); i++) {Students studentsData = new Students();studentsData.setLast_change_id(list.get(i).getLast_change_id());studentsData.setClass_name(list.get(i).getClass_name());studentsDao.insertOrReplace(studentsData);}}});}/*** 修改学生信息** @param studentsData 学生信息*/public void upDateStudents(Students studentsData) {studentsDao.update(studentsData);}/*** 查询所有学生数据*/public List<Students> searchAllStudents() {List<Students> list = studentsDao.queryBuilder().list();return list;}/*** 按条件查询数据学生信息*/public Students searchStudentsByID(int user_id) {Students studentsData = studentsDao.queryBuilder().where(StudentsDao.Properties.Id.eq(user_id)).build().unique();return studentsData;}/*** 按条件查询卡号*/public Students searchStudentsByCard(String card) {Students studentsData = studentsDao.queryBuilder().where(StudentsDao.Properties.Real_number.eq(card)).build().unique();return studentsData;}/*** 删除学生数据*/public void delete(String userId) {studentsDao.queryBuilder().where(StudentsDao.Properties.Id.eq(userId)).buildDelete().executeDeleteWithoutDetachingEntities();}/*** 清理所有学生数据*/public void deleteStudentData() {studentsDao.deleteAll();}}
每天进步一点点。。。
Android基础篇 Android 数据存储与性能相关推荐
- Android移动应用基础教程【数据存储】
本章目录 一.数据存储方式 二.文件存储 1.将数据存入文件中 1.1.内部存储 1.2.外部存储 2.从文件中读取数据 2.1.读取内部存储中的文件的数据 2.2.读取外部存储中的文件数据 3.申请 ...
- 【建议收藏】2020年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(Android基础篇)...
前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. A awesome android expert interview questions a ...
- android app数据存储,基于Android开发的APP数据存储研究
谢原武+龙文 摘要: 作为一个完整的应用程序,数据存储操作是必不可少的.Android系统一共提供了四种数据存储方式分别为File文件存储.Shared Preferences存储.ContentPr ...
- android中资源文件的两种访问方式,在android开发中进行数据存储与访问的多种方式介绍...
在android开发中进行数据存储与访问的多种方式介绍 更新时间:2013年06月07日 16:24:23 作者: 很多时候我们的软件需要对处理后的数据进行存储或再次访问,Android为数据存储 ...
- Android 小项目之--数据存储【Files】(附源码)
继上篇数据存储,现在我们来讲讲另外一种数据存储,Files.本篇讲述步骤如下: 1.温故而知新,复习四种数据存储的区别. 2.什么是 Files 数据存储. 3.什么是 Properties ? 4. ...
- 2010-02-28 传智播客—Android(三)数据存储之三SQLite嵌入式数据库
2010-02-28 传智播客-Android(三)数据存储之三SQLite嵌入式数据库 前两篇日志我已经总结了本地数据存储的前两种:文件和配置项.还剩下最后一种数据库存储--SQLite. 一.SQ ...
- Android应用开发:数据存储和界面展现-1
1. 相对布局RelativeLayout 特点:相对布局所有组件可以叠加在一起:各个组件的布局是独立的,互不影响:所有组件的默认位置都是在左上角(顶部.左部对齐) 属性 功能描述 android:l ...
- android各目录大小,Android 基础篇 — 放不同drawable文件夹中图片的大小
我们接着上篇文章Android 基础篇 - 不同DPI取哪个本地文件夹中的资源 讲,文末尾提到一个问题,为什么不同drawable文件夹中的图片大小在终端设备会不一样? 1 准备 在drawable- ...
- Android攻城狮数据存储之SharedPreferences
Android的四种数据存储方式: 1. SharedPreferences 2. SQLite 3. Content Provider 4. File --------------------- S ...
最新文章
- 面试准备--7.31
- 年终总结,程序员票选最喜欢的编程语言花落谁家?
- mpp新增一个字段_如何快速新增百万测试数据?
- java抽象类到底能不能够实例化?
- Java实现冒泡排序及其优化
- python3.7操作kafka_python3.7新增关键字:async、await;带来和kafka-python==1.4.2的兼容性问题...
- 数学--数论--POJ281(线性同余方程)
- 功能Java示例 第7部分–将失败也视为数据
- export function函数传参_04 js高阶函数(惰性函数、柯里化函数、compose函数)和单例设计模式...
- idea关闭coverage
- beginnersbook C++ 教程·翻译完成 | ApacheCN
- ZStack的VPC特性详解及实战
- 数据库学习一站式入门资料(纯干货)
- 汉诺塔五层C语言程序,汉诺塔的c语言程序
- 百度云无限速下载工具:JDownloader 2 for Mac
- jena mysql_在Jena框架下基于MySQL数据库实现本体的存取操作
- python人工智能方向怎么学_如何学习人工智能
- linux下github使用教程,Linux下git操作GitHub步骤教程
- Winform从入门到精通(38)——StatusStrip(史上最全)
- Android 无需 root 卸载系统应用
热门文章
- Eventually Consistent(最终一致性)
- android webview 清除历史,如何在android中清除webview历史记录
- Python 基础学习 locals()用法
- 利用python爬取qq个性网图片
- 在x86平台制作龙芯版debian 10系统(mips64el)
- 安娜堡计算机工程光学专业,美国排名前12的电气电子工程专业研究生院校
- 【李开复】给中国学生的第七封信——21世纪最需要的7种人才(七)
- ms08-067漏洞复现
- Metasploit利用MS08-067漏洞
- Sequence序列的理解和使用