文章目录

  • 前言
    • 有关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 数据存储与性能相关推荐

  1. Android移动应用基础教程【数据存储】

    本章目录 一.数据存储方式 二.文件存储 1.将数据存入文件中 1.1.内部存储 1.2.外部存储 2.从文件中读取数据 2.1.读取内部存储中的文件的数据 2.2.读取外部存储中的文件数据 3.申请 ...

  2. 【建议收藏】2020年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(Android基础篇)...

    前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. A awesome android expert interview questions a ...

  3. android app数据存储,基于Android开发的APP数据存储研究

    谢原武+龙文 摘要: 作为一个完整的应用程序,数据存储操作是必不可少的.Android系统一共提供了四种数据存储方式分别为File文件存储.Shared Preferences存储.ContentPr ...

  4. android中资源文件的两种访问方式,在android开发中进行数据存储与访问的多种方式介绍...

    在android开发中进行数据存储与访问的多种方式介绍 更新时间:2013年06月07日 16:24:23   作者: 很多时候我们的软件需要对处理后的数据进行存储或再次访问,Android为数据存储 ...

  5. Android 小项目之--数据存储【Files】(附源码)

    继上篇数据存储,现在我们来讲讲另外一种数据存储,Files.本篇讲述步骤如下: 1.温故而知新,复习四种数据存储的区别. 2.什么是 Files 数据存储. 3.什么是 Properties ? 4. ...

  6. 2010-02-28 传智播客—Android(三)数据存储之三SQLite嵌入式数据库

    2010-02-28 传智播客-Android(三)数据存储之三SQLite嵌入式数据库 前两篇日志我已经总结了本地数据存储的前两种:文件和配置项.还剩下最后一种数据库存储--SQLite. 一.SQ ...

  7. Android应用开发:数据存储和界面展现-1

    1. 相对布局RelativeLayout 特点:相对布局所有组件可以叠加在一起:各个组件的布局是独立的,互不影响:所有组件的默认位置都是在左上角(顶部.左部对齐) 属性 功能描述 android:l ...

  8. android各目录大小,Android 基础篇 — 放不同drawable文件夹中图片的大小

    我们接着上篇文章Android 基础篇 - 不同DPI取哪个本地文件夹中的资源 讲,文末尾提到一个问题,为什么不同drawable文件夹中的图片大小在终端设备会不一样? 1 准备 在drawable- ...

  9. Android攻城狮数据存储之SharedPreferences

    Android的四种数据存储方式: 1. SharedPreferences 2. SQLite 3. Content Provider 4. File --------------------- S ...

最新文章

  1. 面试准备--7.31
  2. 年终总结,程序员票选最喜欢的编程语言花落谁家?
  3. mpp新增一个字段_如何快速新增百万测试数据?
  4. java抽象类到底能不能够实例化?
  5. Java实现冒泡排序及其优化
  6. python3.7操作kafka_python3.7新增关键字:async、await;带来和kafka-python==1.4.2的兼容性问题...
  7. 数学--数论--POJ281(线性同余方程)
  8. 功能Java示例 第7部分–将失败也视为数据
  9. export function函数传参_04 js高阶函数(惰性函数、柯里化函数、compose函数)和单例设计模式...
  10. idea关闭coverage
  11. beginnersbook C++ 教程·翻译完成 | ApacheCN
  12. ZStack的VPC特性详解及实战
  13. 数据库学习一站式入门资料(纯干货)
  14. 汉诺塔五层C语言程序,汉诺塔的c语言程序
  15. 百度云无限速下载工具:JDownloader 2 for Mac
  16. jena mysql_在Jena框架下基于MySQL数据库实现本体的存取操作
  17. python人工智能方向怎么学_如何学习人工智能
  18. linux下github使用教程,Linux下git操作GitHub步骤教程
  19. Winform从入门到精通(38)——StatusStrip(史上最全)
  20. Android 无需 root 卸载系统应用

热门文章

  1. Eventually Consistent(最终一致性)
  2. android webview 清除历史,如何在android中清除webview历史记录
  3. Python 基础学习 locals()用法
  4. 利用python爬取qq个性网图片
  5. 在x86平台制作龙芯版debian 10系统(mips64el)
  6. 安娜堡计算机工程光学专业,美国排名前12的电气电子工程专业研究生院校
  7. 【李开复】给中国学生的第七封信——21世纪最需要的7种人才(七)
  8. ms08-067漏洞复现
  9. Metasploit利用MS08-067漏洞
  10. Sequence序列的理解和使用