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

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键