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

在应用开发之中,特别是移动应用的开发,我们使用的所有数据几乎都保存在服务器之中,如果我们每一次使用数据特别是那些使用频率非常高但是表数据改动非常小的数据时(用户的头像,用户的用户名…)每次使用都从服务器上面去获得的话,会造成大量的流量浪费并且严重影响了用户体验。将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好。
那么作为移动界的两大系统,苹果和谷歌分别为我们提供了什么样子的数据保存方式那?本文会给大家仔细的讲解一下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","没有找到");
        //让我们打印一下看看是否找到了这个name
        Log.d(MY_LOG,"name:"+name);
        //ok事实证明我们通过name这个key找到了对应的values

        //现在我们在使用同样的方法获取一边shared对象,我们把它叫做mShared2
        SharedPreferences 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:1094935136
          mShard2: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都会有一个大概的了解了,希望能对大家有所帮助。

你可能感兴趣的:(ios,android,数据,数据存储)