Android与IOS异同点对比 ( 2 ) ------ 数据存储(SharedPreferences VS NSUserDefaults)

本文主要是介绍Android与IOS异同点对比 ( 2 ) ------ 数据存储(SharedPreferences VS NSUserDefaults),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欢迎大家访问我的个人网站 - Sunday俱乐部


在应用开发之中,特别是移动应用的开发,我们使用的所有数据几乎都保存在服务器之中,如果我们每一次使用数据特别是那些使用频率非常高但是表数据改动非常小的数据时(用户的头像,用户的用户名…)每次使用都从服务器上面去获得的话,会造成大量的流量浪费并且严重影响了用户体验。将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好。
那么作为移动界的两大系统,苹果和谷歌分别为我们提供了什么样子的数据保存方式那?本文会给大家仔细的讲解一下Android/IOS数据存储的那点事。


Android、
在Android系统中提供了多种存储技术.通过这些存储技术可以将数据存储在各种存储介质上.比如sharedpreferences可以将数据保存着应用软件的私有存储区,这些存储区的数据只能被写入这些数据的软件读取.当然Android还支持文件存储、SQLite数据库和Content Provider。在这里我们将对sharedpreferences存储方式进行介绍。
SharedPreferences是一种轻量级的数据存储方式,学过Web开发的同学,可以想象它是一个小小的Cookie。它可以用键值对的方式把简单数据类型(boolean、int、float、long和String)存储在应用程序的私有目录下(data/data/包名 /shared_prefs/)自己定义的xml文件中。
SharedPreferences是以键值对来存储应用程序的配置信息的一种方式,它只能存储基本数据类型。一个程序的配置文件仅可以在本应用程序中使用,或者说只能在同一个包内使用,不能在不同的包之间使用。实际上sharedPreferences是采用了XML格式将数据存储到设备中,在DDMS中的File Explorer中的/data/data//shares_prefs下。
在所有的Android SDK存储技术中SharedPreferences技术是最容易理解和使用的,因为SharedPreferences处理的就是一个key–value对。比如保存产品的名称,就可以将key设为produceName,value为实际的产品名。
说了那么多的理论,现在看一下实际的东西,大家看一下下面的代码。

      //获取SharedPreferences接口对象,SharedPreferences mShared = getSharedPreferences("person",MODE_PRIVATE);//如果要存入的话,需要获取editor对象SharedPreferences.Editor mEditor = mShared.edit();//使用editor去存储数据mEditor.putString("name","LGD_Sunday");mEditor.putString("sex","男");mEditor.putString("num","23");//数据put完成之后需要去提交它mEditor.commit();//-----获取被保存的数据-------//使用getAll可以获得当前的这个对象中保存的所有数据,从返回结果之中也可以看到,它是一个键值对的Map集合Map<String,Object> mMap = (Map<String, Object>) mShared.getAll();//现在让我们看一下数据是否被正确的保存下来了Log.d(MY_LOG,"mMap:"+mMap.toString());//当然 我们也可以直接从Shared对象中去取出指定的值String name = mShared.getString("name","没有找到");//让我们打印一下看看是否找到了这个nameLog.d(MY_LOG,"name:"+name);//ok事实证明我们通过name这个key找到了对应的values//现在我们在使用同样的方法获取一边shared对象,我们把它叫做mShared2SharedPreferences mShared2 = getSharedPreferences("person",MODE_PRIVATE);//我们看一下使用mShared2是否还可以获取到我们在mShared中保存的数据Map<String,Object> mMap2 = (Map<String, Object>) mShared2.getAll();Log.d(MY_LOG,"mMap2:"+mMap2.toString());//通过打印的数据可以看到我们依然可以获取到我们在mShared对象上面去保存的数据,为什么会这样那?//在面向对象的语言中,不同的对象只不过是相同类型的不同个体罢了,让我们去打印一下它的hashCode看一下Log.d(MY_LOG,"mShared:"+mShared.hashCode()+"\nmShard2:"+mShared2.hashCode());//通过打印出来的hashcode值可以看出来,它们拥有相同的hashcode,也就是说我们通过getSharedPreferences(,)方法获取到的是一个单例的对象//所以说 我们也可以通过mShared2对mShared内部的数据去进行操作SharedPreferences.Editor mEditor2 = mShared2.edit();mEditor2.remove("sex");mEditor2.putString("height","182cm");mEditor2.commit();//让我们看一下mShared中的数据是否发生了改变Log.d(MY_LOG,mShared.getAll().toString());//跟我们料想的一样mShared对象保存的数据一样发生了改变。//其实 google也给我们提供了一个在程序创建时就自动生成了的sharedPreferences//这个shared对象不需要你去提供一个名字,它作为整个应用的首选项//它比getSharedPreferences(,);更加的快速SharedPreferences systemShared = getPreferences(MODE_PRIVATE);

打印结果:

D/mTest﹕ mMap:{sex=男, num=23, name=LGD_Sunday}
D/mTest﹕ name:LGD_Sunday
D/mTest﹕ mMap2:{sex=男, num=23, name=LGD_Sunday}
D/mTest﹕ mShared:1094935136mShard2:1094935136
D/mTest﹕ {num=23, name=LGD_Sunday, height=182cm}

上面的代码比较详细,基本上说明了SharedPreferences的基本用法。


IOS、
NSUserDefaults类提供了一个与默认系统进行交互的编程接口。NSUserDefaults对象是用来保存,恢复应用程序相关的偏好设置,配置数据等等。默认系统允许应用程序自定义它的行为去迎合用户的喜好。你可以在程序运行的时候从用户默认的数据库中读取程序的设置。同时NSUserDefaults的缓存避免了在每次读取数据时候都打开用户默认数据库的操作。可以通过调用synchronize方法来使内存中的缓存与用户默认系统进行同步。
NSUserDefaults类提供了非常方便的方法来获取常用的类型,例如floats,doubles,intergers,Booleans,URLs。所以一个NSUserDefaults的对象必须是属性表,这也就是说我们可以存储NSData,NSString,NSNUmber,NSDate,NSArray,NSDictionary这些实例。如果你想存储其他类型的对象,你要将其归档并创建一个NSData来实现存储。
看下面的事例代码:

 //获取系统已经帮助你生成好的NSUserDefaults对象,同样他也是一个单例的对象NSUserDefaults *mNsUserDefaults = [NSUserDefaults standardUserDefaults];//使用NSUserDefaults对象本身就可以完成数据的存储操作[mNsUserDefaults setValue:@"LGD_Sunday" forKey:@"name"];[mNsUserDefaults setValue:@"男" forKey:@"sex"];[mNsUserDefaults setValue:@"23" forKey:@"num"];//在数据被提交了之后,如果要保存它同样需要提交,这里被称为同步。[mNsUserDefaults synchronize];//我们可以使用这个方法来查看被保存的数据NSString *string = [mNsUserDefaults objectForKey:@"name"];NSLog(@"string : %@",string);//NSUserDefaults可以保存一个字典对象  例如NSMutableDictionary *mDictionary = [[NSMutableDictionary alloc] init];[mDictionary setValue:@"182cm" forKey:@"height"];[mNsUserDefaults setValue:mDictionary forKey:@"dict"];//我们会发现这样写是错误的,他会给我们一个警告,如果我们尝试对mUserDict的值进行改变的话,程序就会崩溃
//    NSMutableDictionary *mUserDict = [mNsUserDefaults dictionaryForKey:@"dict"];
//    [mUserDict setValue:@"IOS" forKey:@"title"];//从NSUserDefaults返回的值是不可改变的,即便是你在存储的时候使用的是可变的值。NSDictionary *mUserDict = [mNsUserDefaults dictionaryForKey:@"dict"];//我们可以输出看一下他得知NSLog(@"mUserDict : %@",mUserDict);//NSUserDefaults可以存储NSData类型,我们可以吧一个UIImage对象转变为NSData类型存储到NSUserdafaults中,等于使用NSUserDefaults变相的存储了一张图片UIImage *mImage = [UIImage imageNamed:@"mImage"];//将UIImage对象转化为NSData对象NSData *mData = UIImageJPEGRepresentation(mImage, 1.0);//把mData放入NSUserDefaults之中[mNsUserDefaults setObject:mData forKey:@"mImage"];//我们验证一下mImage转化的NSData对象是否被保存了下来NSData *mImageData = [mNsUserDefaults objectForKey:@"mImage"];[self.mImage setImage:[UIImage imageWithData:mImageData]];//事实证明存储的没有任何问题

LOG:
2015-06-08 15:54:20.218 IOS数据存储[3451:199563] string : LGD_Sunday
2015-06-08 15:54:20.223 IOS数据存储[3451:199563] mUserDict : {
height = 182cm;
}


相同点:
1、都是通过键值对的方式去保存数据。
2、保存之后返回的值的类型均不可变。
3、他们都只适合保存少量的数据,不适合保存大量数据。
4、都使用String类型的Key值
5、在数据保存之后都需要提交一次。[mNsUserDefaults synchronize]; editor.commit();
6、它们都是单例的
不同点:
1、sharedPreferences可以创建多个(并且可以自定义它的操作模式)我们可以通过不同的Name去取出不同的sharedPreferences对象,就好像在通过不同的表名去取不同的表一样。NSUserDefault是系统自动为用户创建的,我们没有办法使用NSUserDefault去主动创建一个数据库出来,NSUserDefault对象在你的整个应用程序之中都是一个单例的。
2、sharedPreferences本身只提供了读取数据的功能,更改数据需要使用Editor对象。NSUserDefault集存储和更改为一身。
3、sharedPreferences只可以去存储基本数据类型,NSUserDefault可以存储NSData,NSString,NSNUmber,NSDate,NSArray,NSDictionary这些实例(从NSUserDefaults返回的值是不可改变的,即便是你在存储的时候使用的是可变的值)。


相信看了这些大家对SharedPreferences 和 NSUserDefaults都会有一个大概的了解了,希望能对大家有所帮助。

这篇关于Android与IOS异同点对比 ( 2 ) ------ 数据存储(SharedPreferences VS NSUserDefaults)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1014018

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口