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

相关文章

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了

Windwos +vs 2022 编译openssl 1.0.2 库

一 前言 先说 结论,编译64位报错,查了一圈没找到解决方案,最后换了32位的。 使用qt访问web接口,因为是https,没有openssl库会报错 QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());if (reply){if (reply->error() == QNetworkReply::NoError

【服务器运维】MySQL数据存储至数据盘

查看磁盘及分区 [root@MySQL tmp]# fdisk -lDisk /dev/sda: 21.5 GB, 21474836480 bytes255 heads, 63 sectors/track, 2610 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical)

iOS HTTPS证书不受信任解决办法

之前开发App的时候服务端使用的是自签名的证书,导致iOS开发过程中调用HTTPS接口时,证书不被信任 - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAu

Eclipse+ADT与Android Studio开发的区别

下文的EA指Eclipse+ADT,AS就是指Android Studio。 就编写界面布局来说AS可以边开发边预览(所见即所得,以及多个屏幕预览),这个优势比较大。AS运行时占的内存比EA的要小。AS创建项目时要创建gradle项目框架,so,创建项目时AS比较慢。android studio基于gradle构建项目,你无法同时集中管理和维护多个项目的源码,而eclipse ADT可以同时打开

android 免费短信验证功能

没有太复杂的使用的话,功能实现比较简单粗暴。 在www.mob.com网站中可以申请使用免费短信验证功能。 步骤: 1.注册登录。 2.选择“短信验证码SDK” 3.下载对应的sdk包,我这是选studio的。 4.从头像那进入后台并创建短信验证应用,获取到key跟secret 5.根据技术文档操作(initSDK方法写在setContentView上面) 6.关键:在有用到的Mo

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

Android我的二维码扫描功能发展史(完整)

最近在研究下二维码扫描功能,跟据从网上查阅的资料到自己勉强已实现扫描功能来一一介绍我的二维码扫描功能实现的发展历程: 首页通过网络搜索发现做android二维码扫描功能看去都是基于google的ZXing项目开发。 2、搜索怎么使用ZXing实现自己的二维码扫描:从网上下载ZXing-2.2.zip以及core-2.2-source.jar文件,分别解压两个文件。然后把.jar解压出来的整个c

android 带与不带logo的二维码生成

该代码基于ZXing项目,这个网上能下载得到。 定义的控件以及属性: public static final int SCAN_CODE = 1;private ImageView iv;private EditText et;private Button qr_btn,add_logo;private Bitmap logo,bitmap,bmp; //logo图标private st

Android多线程下载见解

通过for循环开启N个线程,这是多线程,但每次循环都new一个线程肯定很耗内存的。那可以改用线程池来。 就以我个人对多线程下载的理解是开启一个线程后: 1.通过HttpUrlConnection对象获取要下载文件的总长度 2.通过RandomAccessFile流对象在本地创建一个跟远程文件长度一样大小的空文件。 3.通过文件总长度/线程个数=得到每个线程大概要下载的量(线程块大小)。