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

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问