首页 > 代码库 > IOS数据存储方式

IOS数据存储方式

1,ios中常用的数据存储方式有4中

 1》XML属性列表(plist)归档

 2》Preference(偏好设置)

 3》NSKeyedArchiver归档

 4》SQLite

2,每个应用程序都有自己的沙盒,沙河的路径为

/Users/apple/Library/Application Support/iPhone Simulator/7.0/Applications(apple为用户名,7.0位模拟器版本)

每个应用沙河都是独立的,里面的结构主要有;

Document:这个主要用来保存运行时“用户”生成的需要持久化的数据,iTunes同步的时候会备份该目录。(一般应用下载的数据不要保存在这个目录,要不然苹果审核的时候应用程序通不过,本人就吃过这个亏。)

tmp:保存应用运行是所需要的临时数据,使用完毕后再删除, iTunes同步的时候不会备份该目录。

Library:

   1》Library/Caches:保存应用运行时生成的需要持久化的数据, iTunes同步的时候不会备份该目录。

  2》Library/Preference:保存应用程序的所以偏好设置,iTunes同步的时候会备份该目录。

 

3,下面给大家来几段简单的事例程序,献丑了。

 

如果属性列表是?种XML格式的?文件,拓展名为plist

? 如果对象是NSStringNSDictionaryNSArrayNSDataNSNumber等类型,就可以使?用writeToFile:atomically:?法直接将对象写到属性列表?文件中 。

    1> : Document:

  写数据:

 {

  //1,获取沙盒中Document的路径

    NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

    //2,拼接保存文件的路径

    NSString *path = [documents stringByAppendingPathComponent:@"array.plist"];

    //3,把数据写到plist

    NSArray *array = @[@"li",@"kui",@"liang"];

    [array writeToFile:path atomically:YES];

}

  读取数据:

{

  //,拼接保存文件的路径

  NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];   

    NSString *path = [documents stringByAppendingPathComponent:@"array.plist"];

  NSArray *array =  [NSArrayarrayWithContentsOfFile:path];

    NSLog(@"array = %@",array); 

}

  2 > :偏好设置 Preferences :

缺点:(1)不能保存自定义对象

          (2)无任保存多少数据都是在同一个文件中

保存数据:

{

//获取偏好设置对象,默认会将数据保存到Perferences,并且有默认的文件名称,所以不用指定文件名称和路径

    //一般以standarddefault,开头的都是单例对象

    NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];

    

    //保存数据

    [defaults setObject:@"lkl" forKey:@"name"];

    [defaults setInteger:25 forKey:@"age"];

    [defaults setDouble:1.75 forKey:@"heigth"];

    

    //一般Perferences中的数据不会立即保存,需要调用这个方法立即保存

    [defaults synchronize];

}

读取数据:

{

  NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];  

   NSString *name = [defaults stringForKey:@"name"];

   double heigth = [defaults doubleForKey:@"heigth"];

   NSInteger age = [defaults integerForKey:@"age"]; 

}

 

NSKeyedArchiver :

? 如果是自定义对象,不能调用writeToFile:atomically:?法直接将对象写到属性列表?文件中 。

  • 如果对象是NSStringNSDictionaryNSArrayNSDataNSNumber等类型,可以直接?用NSKeyedArchiver进?行归档和恢复

  • 不是所有的对象都可以直接?用这种?方法进?行归档,只有遵守了NSCoding 协议的对象才可以 

  

  • NSCoding协议有2个?方法:

  encodeWithCoder:

每次归档对象时,都会调?用这个?方法。一般在这个?方法?里?面指定如何归档对象中的每 个实例变量,可以使?用encodeObject:forKey:?方法归档实例变量

  initWithCoder:

每次从?文件中恢复(解码)对象时,都会调?用这个?方法。一般在这个?方法?里?面指定如何 解码?文件中的数据为对象的实例变量,可以使?用decodeObject:forKey?方法解 码实例变量 

例题:

NSKeyedArchiver-归档Person对象(Person.h) @interface Person : NSObject<NSCoding>

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, assign) float height;
@end

@implementation Person

  • -  (void)encodeWithCoder:(NSCoder *)encoder {

    [encoder encodeObject:self.name forKey:@"name"];

  • [encoder encodeInt:self.age forKey:@"age"];

  • [encoder encodeFloat:self.height forKey:@"height"];

    }

  • -  (id)initWithCoder:(NSCoder *)decoder {

  • self.name = [decoder decodeObjectForKey:@"name"];

  • self.age = [decoder decodeIntForKey:@"age"];

  • self.height = [decoder decodeFloatForKey:@"height"];

  • return self;

    }

  • ? 归档(编码)
    Person *person = [[[Person alloc] init] autorelease]; person.name = @"lkl";
    person.age = 25;
    person.height = 1.75f;
    [NSKeyedArchiver archiveRootObject:person toFile:path];

    ? 恢复(解码)

    Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:path];