zoukankan      html  css  js  c++  java
  • 关于客户端设计之数据分类和存储 的思考

    一、关于数据的分类

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

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

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

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

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

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

    2、通过Java中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<String> 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()。
         * <p>使用apply()需要synchronized处理同步<p/>
         */
        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<String> getChildNameSet() {
            if(childNameSet==null){
                childNameSet = parentPreferences.getStringSet(KEY_CHILD_NAME_LIST,null);
            }
            return childNameSet;
        }
    
        public synchronized boolean setChildNameSet(Set<String> 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、对复杂的逻辑数据存储。

  • 相关阅读:
    C++学习之【使用位操作符求素数分析】
    LeetCodeOJ刷题之13【Roman to Integer】
    QT学习之文件系统读写类
    让免费版MarkdownPad2使用Pro版本的功能
    QT学习之窗口右键菜单
    react 16.3+ 新生命周期 作业
    react 16.3+ 新生命周期
    node层设置proxy不生效的原因
    Javascript权威指南——读书笔记
    react踩坑
  • 原文地址:https://www.cnblogs.com/cold-ice/p/6836311.html
Copyright © 2011-2022 走看看