热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android-存储1:SharedPreferences使用及其存储类型

日常开发中我们常常要用到保存数据,Android中常用的存储方式有SQLite,sharedPreferences等,当然也有各自的应用场景,前者适用于保存较多数据的情形,后者责倾向于保存

日常开发中我们常常要用到保存数据,Android中常用的存储方式有SQLite,sharedPreferences 等,当然也有各自的应用场景,前者适用于保存较多数据的情形,后者责倾向于保存用户偏好设置比如某个checkbox的选择状态,用户登录的状态、配置信息,实现记住密码功能等等,都是以键值对的形式进行的文件读取。

但是每存储一个数据都要提供一个key,如果要存储多个数据那岂不是要写多个key?例如我们要保存一个用户的登录信息,比如用户昵称,个性签名,登录时间………尼玛我一条数据写一个的话我都可以玩一盘撸啊撸了~反正我是受不了~那么我们能否将用户信息封装起来,统一以一个key来保存呢?答案是肯定可以的~ 
Java类库中提供的字节输入输出流可以轻松帮我们完成任意类型到String的可逆转换,继而我们就可以保存到Share中了~

SharedPreferences只能保存简单类型的数据,例如四种基本类型(int,float,long,boolean)+String。如果需要存取比较复杂的数据类型比如类或者图像,则需要对这些数据进行编码,通常将其转换成Base64编码,然后将转换后的数据以字符串的形式保存在XML文件中。

这里写图片描述

简单使用:

可保存的类型: 
string,int,float,long,boolean

        //获取sharedPreferences对象
        SharedPreferences sharedPreferences = getSharedPreferences("zjl", Context.MODE_PRIVATE);
        //获取editor对象
        SharedPreferences.Editor editor = sharedPreferences.edit();//获取编辑器
        //存储键值对
        editor.putString("name", "周杰伦");

        editor.putInt("age", 24);
        editor.putBoolean("isMarried", false);
        editor.putLong("height", 175L);
        editor.putFloat("weight", 60f);

        editor.putStringSet("where", set);
        //提交
        editor.commit();//提交修改





        SharedPreferences sharedPreferences = getSharedPreferences("zjl", Context.MODE_PRIVATE);
        //getString()第二个参数为缺省值,如果preference中不存在该key,将返回缺省值
        String name = sharedPreferences.getString("name", "");
        int age = sharedPreferences.getInt("age", 1);

存储对象:

方法一:fastJson/Gson/Jackson将对象转换成字符串,然后再保存。 
方法二:ObjectOutputStream将对象转化成流,base64将流转成字符串,然后再保存。

package com.example.draggridview;

/** * Created by Administrator on 2017/6/19. */

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Base64;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/** * SharedPreferences工具类,可以保存object对象 */
public class SharedPreferenceUtil {

    /** * 存放实体类以及任意类型 * * @param context 上下文对象 * @param key * @param obj */
    public static void putBean(Context context, String key, Object obj) {
        if (obj instanceof Serializable) {// obj必须实现Serializable接口,否则会出问题
            try {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(baos);
                oos.writeObject(obj);
                String string64 = new String(Base64.encode(baos.toByteArray(), 0));
                SharedPreferences.Editor editor = getSharedPreferences(context).edit();
                editor.putString(key, string64).commit();
            } catch (IOException e) {
                e.printStackTrace();
            }

        } else {
            throw new IllegalArgumentException("the obj must implement Serializble");
        }

    }

    public static Object getBean(Context context, String key) {
        Object obj = null;
        try {
            String base64 = getSharedPreferences(context).getString(key, "");
            if (base64.equals("")) {
                return null;
            }
            byte[] base64Bytes = Base64.decode(base64.getBytes(), 1);
            ByteArrayInputStream bais = new ByteArrayInputStream(base64Bytes);
            ObjectInputStream ois = new ObjectInputStream(bais);
            obj = ois.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return obj;
    }

}

参考:

使用SharedPreference保存list数据,其实可以保存Object对象

Android开发笔记——SharedPreferences 存储实体类以及任意类型

Android数据持久化之SharedPreference

AIDL支持的数据类型

  1. 所有基础类型(byte/short/int/long/float/double/boolean/char 等)
  2. String,List,Map,CharSequence等类
  3. 其他AIDL接口类型
  4. 所有Parcelable的类

bundle可传递数据类型:

1、byte/short/int/long/float/double/boolean/char等八种基本类型或它们对应的数组, 
2、String、charsequence或对应的数组,也可以是对象()或对象数组。 
3、Bundle.putSerializable(Key,Object); //实现Serializable接口的对象 
4、Bundle.putParcelable(Key, Object); //实现Parcelable接口的对象

这里写图片描述 
这里写图片描述 
这里写图片描述 
这里写图片描述

intent可传递数据类型:

intent传递类型(abcd) 
A、Serializable B、charsequence C、Parcelable D、Bundle

1、八种基本数据类型 及其对应数组 
2、String/Charsequence 及其对应数组 
3、Parcelable 及其对应数组 /Serializable 
4、bundle/intent

这里写图片描述 
这里写图片描述 

这里写图片描述

使用步骤:

1、得到SharedPreferences对象

2、调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。

3、向SharedPreferences.Editor对象中添加数据。

4、调用commit方法将添加的数据提交。

详细过程:

1、得到SharedPreferences对象

方法1: 
Context.getSharedPreferences(文件名称,操作模式) 
文件名称不存在就会创建一个,操作模式有两种: 
MODE_PRIVATE:默认操作模式,直接在把第二个参数写0就是默认使用这种操作模式,这种模式表示只有当前的应用程序才可以对当前这个SharedPreferences文件进行读写。 
MODE_MULTI_PRIVATE:用于多个进程共同操作一个SharedPreferences文件。

注:MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE这两种模式已经在android 4.2版本以后废弃了。 
方法2: 
Activity.getPreferences(操作模式) 
使用这个方法会自动将当前活动的类名作为SharedPreferences的文件名,底层调用的是下面这个方法 
Activity.getSharedPreferences(String name, int mode)我们也可以直接调用getSharedPreferences这个方法,传入自定义的名字。 
方法3 
PreferenceManager.getDefaultSharedPreferences(Context) 
使用这个方法会自动使用当前程序的包名作为前缀来命名SharedPreferences文件

2、调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。

SharedPreferences.Editor editor = getSharedPreferences(“data”,MODE_PRIVATE).edit();

3、向SharedPreferences.Editor对象中添加数据。

editor.putString(“name”,”Lily”); //以键值对形式存储 
editor.putInt(“age”,”20”); //以键值对形式存储 
editor.putBoolean(“married”,false); //以键值对形式存储

4、调用commit方法将添加的数据提交。

editor.commit();

代码示例: 
SharedPreferences pref = MainActivity.this.getSharedPreferences(“data”,MODE_PRIVATE); 
SharedPreferences.Editor editor = pref.edit(); 
editor.putString(“name”,”lily”); 
editor.putString(“age”,”20”); 
editor.putBoolean(“married”,false); 
editor.commit();

如果要读取数据: 
SharedPreferences pref = getSharedPreferences(“data”,MODE_PRIVATE); 
String name = pref.getString(“name”,”“);//第二个参数为默认值 
int age = pref.getInt(“age”,0);//第二个参数为默认值 
boolean married = pref.getBoolean(“married”,false);//第二个参数为默认值

保存对象: 
Android使用SharedPreferences保存对象 - 推酷 
http://www.tuicool.com/articles/6nAZrq

保存list: 
可以将list转化为json字符串,然后以string的形式保存,使用的时候先取出这个string再解析json得到list。





推荐阅读
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 基于SSM框架的在线考试系统:随机组卷功能详解
    本文深入探讨了基于SSM(Spring, Spring MVC, MyBatis)框架构建的在线考试系统中,随机组卷功能的设计与实现方法。 ... [详细]
  • 深入解析 C++ 中的 String 和 Vector
    本文详细介绍了 C++ 编程语言中 String 和 Vector 的使用方法及特性,旨在帮助开发者更好地理解和应用这两个重要的容器。 ... [详细]
  • 在Android中实现黑客帝国风格的数字雨效果
    本文将详细介绍如何在Android平台上利用自定义View实现类似《黑客帝国》中的数字雨效果。通过实例代码,我们将探讨如何设置文字颜色、大小,以及如何控制数字下落的速度和间隔。 ... [详细]
  • 本文详细介绍了 Redis 中的主要数据类型,包括 String、Hash、List、Set、ZSet、Geo 和 HyperLogLog,并提供了每种类型的基本操作命令和应用场景。 ... [详细]
  • td{border:1pxsolid#808080;}参考:和FMX相关的类(表)TFmxObjectIFreeNotification ... [详细]
  • 处理Android EditText中数字输入与parseInt方法
    本文探讨了如何在Android应用中从EditText组件安全地获取并解析用户输入的数字,特别是用于设置端口号的情况。通过示例代码和异常处理策略,展示了有效的方法来避免因非法输入导致的应用崩溃。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 本文探讨了一种常见的C++面试题目——实现自己的String类。通过此过程,不仅能够检验开发者对C++基础知识的掌握程度,还能加深对其高级特性的理解。文章详细介绍了如何实现基本的功能,如构造函数、析构函数、拷贝构造函数及赋值运算符重载等。 ... [详细]
  • 使用Matlab创建动态GIF动画
    动态GIF图可以有效增强数据表达的直观性和吸引力。本文将详细介绍如何利用Matlab软件生成动态GIF图,涵盖基本代码实现与高级应用技巧。 ... [详细]
  • Hanks博士是一位著名的生物技术专家,他的儿子Hankson对数学有着浓厚的兴趣。最近,Hankson遇到了一个有趣的数学问题,涉及求解特定条件下的正整数x,而不使用传统的辗转相除法。 ... [详细]
  • 本文介绍了如何利用OpenCV库进行图像的边缘检测,并通过Canny算法提取图像中的边缘。随后,文章详细说明了如何识别图像中的特定形状(如矩形),并应用四点变换技术对目标区域进行透视校正。 ... [详细]
  • 本文探讨了如何将Python对象转换为字节流,以实现文件保存、数据库存储或网络传输的需求。主要介绍了利用pickle模块进行序列化的具体方法。 ... [详细]
  • 本文深入探讨了WPF框架下的数据验证机制,包括内置验证规则的使用、自定义验证规则的实现方法、错误信息的有效展示策略以及验证时机的选择,旨在帮助开发者构建更加健壮和用户友好的应用程序。 ... [详细]
  • Zabbix自定义监控与邮件告警配置实践
    本文详细介绍了如何在Zabbix中添加自定义监控项目,配置邮件告警功能,并解决测试告警时遇到的邮件不发送问题。 ... [详细]
author-avatar
v时光i
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有