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];
//保存数据
[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:?法直接将对象写到属性列表?文件中 。
-
如果对象是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];