博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于客户端设计之数据分类和存储 的思考
阅读量:4672 次
发布时间:2019-06-09

本文共 3336 字,大约阅读时间需要 11 分钟。

一、关于数据的分类

在 客户端设计过程中,我将数据分为未知,已知(本地),临时,三者之间根据需求相互转化。

  • 未知主要来自用户输入和服务端输入。

  • 已知主要来自sharedPerferences,SQLite等本地存储。

  • 临时主要是指存在于当前内存中的数据。在程序运行后,来自于前两种方式,随载体的生命周期开始,结束。(这里尤其注意单例模式下的数据的特殊,使用static或者Application,各有利弊。)

二、Android下数据单例模式设计

1、Application本身就是单例模式下的类,通过在Application下持有目标的类的引用实现单例的功能,但是当功能的实现在功能类外面,我们考虑的是封装的实现十分困难。

2、通过中static关键词实现。

这里存在两个弊端:

一是Android关于进程的界限模糊,举个例子说,在Activity中静态变量无法再Service中使用。

二是static变量的生命周期过长,环境不会维护它的生命周期,即没有被销毁也没有置null,其对象一直被保持引用。因此我们需要自己维护单例类的生命周期(这与java的思想冲突)。

三、已知数据(本地缓存)的设计

1、无疑第一反应使用封装的sharedPreference,以key-value组织形式,同时本身底层也是通过xml文件实现。

缺陷是对事物的表述能力差,很难对复杂的逻辑描述。比如一个父亲和几个孩子的关系。这里需要依靠SQLilte进行描述。

public class ParentCache {    private static ParentCache parentCache; private SharedPreferences parentPreferences; private Parent parent; private String phone; private String pwd; private Set
childNameSet; private String currentChild; private static final String KEY_PHONE = "phone"; private static final String KEY_PWD = "pwd"; private static final String KEY_CHILD_NAME_LIST = "childNameList"; private static final String KEY_CURRENT_CHILD = "currentChild"; private ParentCache(Context context){ parentPreferences = PreferenceManager.getDefaultSharedPreferences(context); } public static ParentCache getInstance(Context context) { if(parentCache == null) { parentCache = new ParentCache(context.getApplicationContext()); } return parentCache; } /** * 考虑能够通过对返回值处理进行健壮性完善和parent处理,使用commit() not apply()。 *

使用apply()需要synchronized处理同步

*/ public synchronized boolean clearCache() { boolean result = parentPreferences.edit().clear().commit();//commit()也存在对同步的处理。性能存在缺陷。 if (result) { this.parent = null; } return result; } public synchronized String getPhone() { if (TextUtils.isEmpty(pwd)) { pwd = parentPreferences.getString(KEY_PHONE, null); } return pwd; } public synchronized String getPwd() { if (TextUtils.isEmpty(phone)) { phone = parentPreferences.getString(KEY_PHONE, null); } return phone; } public synchronized boolean setPhone(String phone) { SharedPreferences.Editor editor = parentPreferences.edit(); boolean ret = editor.putString(KEY_PHONE, phone).commit(); if (ret) { this.phone = phone; } return ret; } public synchronized boolean setPwd(String pwd) { SharedPreferences.Editor editor = parentPreferences.edit(); boolean ret = editor.putString(KEY_PWD, pwd).commit(); if (ret) { this.pwd = pwd; } return ret; } public synchronized Set
getChildNameSet() { if(childNameSet==null){ childNameSet = parentPreferences.getStringSet(KEY_CHILD_NAME_LIST,null); } return childNameSet; } public synchronized boolean setChildNameSet(Set
childNameSet) { SharedPreferences.Editor editor = parentPreferences.edit(); boolean ret = editor.putStringSet(KEY_CHILD_NAME_LIST,childNameSet).commit(); if (ret){ this.childNameSet = childNameSet; } return ret; } public synchronized String getCurrentChild() { if (TextUtils.isEmpty(currentChild)) { currentChild = parentPreferences.getString(KEY_CURRENT_CHILD,null); } return currentChild; } public boolean setCurrentChild(String currentChild) { SharedPreferences.Editor editor = parentPreferences.edit(); boolean ret = editor.putString(KEY_CURRENT_CHILD, currentChild).commit(); if (ret) { this.currentChild = currentChild; } return ret; } }

 

2、对复杂的逻辑数据存储。

转载于:https://www.cnblogs.com/cold-ice/p/6836311.html

你可能感兴趣的文章
HTML特殊符号
查看>>
【vijos P1914】【codevs 3904】[NOIP2014 普及组T4]子矩阵(dfs+状压dp)
查看>>
MySQL 处理海量数据时一些优化查询速度方法
查看>>
ubuntu 安装nginx 并开启目录浏览功能
查看>>
leetcode[94]Binary Tree Inorder Traversal
查看>>
nginx的addition模块在响应的前后报文添加内容与变量的运行原理
查看>>
Sql日期时间格式转换
查看>>
Winform中ComcoBox控件设置选定项
查看>>
chrome调试技巧
查看>>
concurrency runtime学习笔记之二:并行
查看>>
python基础(三)
查看>>
GraphQL实战经验和性能问题的解决方案
查看>>
MySql大数据量恢复
查看>>
java-字符串反转
查看>>
获取一个目录下的所有文件
查看>>
微软发布Sample Browser for Windows 8版:5000示例代码,"触手可及"
查看>>
Windows 10 使用问题
查看>>
linux xargs命令
查看>>
用CSS3实现图像风格
查看>>
转载--黎曼
查看>>