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

• 如果对象是NSString、NSDictionary、NSArray、NSData、 NSNumber等类型,就可以使⽤用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中,并且有默认的文件名称,所以不用指定文件名称和路径
    //一般以standard,default,开头的都是单例对象
    NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];
    
    //保存数据
setObject:@"lkl" forKey:@"name"];
setInteger:25 forKey:@"age"];
setDouble:1.75 forKey:@"heigth"];
    
    //一般Perferences中的数据不会立即保存,需要调用这个方法立即保存
synchronize];
}

读取数据:

{
  NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];
NSString *name = [defaults stringForKey:@"name"];
double heigth = [defaults doubleForKey:@"heigth"];
NSInteger age = [defaults integerForKey:@"age"]; 
}

 

NSKeyedArchiver :

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

  • 如果对象是NSString、NSDictionary、NSArray、NSData、 NSNumber等类型,可以直接⽤用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];