OC知识点整理

2015-10-10  本文已影响153人  G了个J

归档解档相关

NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO);
// 在iOS中,只有一个目录跟传入的参数匹配,所以这个集合里面只有一个元素
NSString *documents =[array objectAtIndex:0];


1. tmp:NSString*tmp= NSTemporaryDirectory();
2. Library/Caches:(跟Documents类似的2种方法)
利用沙盒根目录拼接”Caches”字符串
利用NSSearchPathForDirectoriesInDomains函数(将函数的第2个参数改为:NSCachesDirectory即可)
3. Library/Preference:通过NSUserDefaults类存取该目录下的设置信息
 - 属性列表是一种XML格式的文件,拓展名为plist
如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,就可以使用writeToFile:atomically:方法直接将对象写到属性列表文件中
- 归档
将一个NSDictionary对象归档到一个plist属性列表中
```objc
//将数据封装成字典
NSMutableDictionary *dict= [NSMutableDictionarydictionary];
[dict setObject:@"母鸡" forKey:@"name"];
[dict setObject:@"15013141314"forKey:@"phone"];
[dict setObject:@"27"forKey:@"age"];
//将字典持久化到Documents/stu.plist文件中
[dict writeToFile:pathatomically:YES];

读取属性列表,恢复NSDictionary对象

// 读取Documents/stu.plist的内容,实例化NSDictionary
NSDictionary *dict= [NSDictionarydictionaryWithContentsOfFile:path];
NSLog(@"name:%@", [dictobjectForKey:@"name"]);
NSLog(@"phone:%@", [dictobjectForKey:@"phone"]);
NSLog(@"age:%@", [dictobjectForKey:@"age"]);
NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];
NSString *username =[defaults stringForKey:@"username"];
float textSize= [defaults floatForKey:@"text_size"];
BOOL autoLogin= [defaults boolForKey:@"auto_login"];
- 注意:UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题,可以通过调用synchornize方法强制写入

[defaults synchornize];

NSKeyedArchiver

NSArray *array = [NSArray arrayWithObjects:@”a”,@”b”,nil];
[NSKeyedArchiverarchiveRootObject:arraytoFile:path];

恢复(解码)NSArray对象

NSArray *array = [NSKeyedUnarchiverunarchiveObjectWithFile:path];
@interfacePerson : NSObject<NSCoding>
@property (nonatomic, copy) NSString*name;
@property (nonatomic, assign) intage;
@property (nonatomic, assign)float height;
@end

Person.m

  @implementation Person
          - (void)encodeWithCoder:(NSCoder *)encoder {
            [encoder encodeObject:self.nameforKey:@"name"];
            [encoder encodeInt:self.ageforKey:@"age"];
            [encoder encodeFloat:self.heightforKey:@"height"];
}
          - (id)initWithCoder:(NSCoder *)decoder {
            self.name = [decoder decodeObjectForKey:@"name"];
            self.age = [decoder decodeIntForKey:@"age"];
            self.height = [decoder decodeFloatForKey:@"height"];
            return self;
}
          - (void)dealloc{
            [super dealloc];
[_name release];
}
@end
        ```
- NSKeyedArchiver-归档Person对象(编码和解码)
    归档(编码)
```objc
Person *person = [[[Person alloc] init] autorelease];
person.name=@"MJ";
person.age= 27;
person.height= 1.83f;
[NSKeyedArchiverarchiveRootObject:persontoFile:path];

恢复(解码)

Person *person= [NSKeyedUnarchiverunarchiveObjectWithFile:path];

NSData

NSData-归档2个Person对象到同一文件中

//新建一块可变数据区
NSMutableData *data = [NSMutableDatadata];
//将数据区连接到一个NSKeyedArchiver对象
NSKeyedArchiver *archiver= [[[NSKeyedArchiveralloc] initForWritingWithMutableData:data] autorelease];
//开始存档对象,存档的数据都会存储到NSMutableData中
[archiverencodeObject:person1 forKey:@"person1"];
[archiverencodeObject:person2 forKey:@"person2"];
//存档完毕(一定要调用这个方法)
[archiverfinishEncoding];
//将存档的数据写入文件
[data writeToFile:pathatomically:YES];

NSData-归档2个Person对象到同一文件中

恢复(解码)

// 从文件中读取数据
NSData *data = [NSDatadataWithContentsOfFile:path];
// 根据数据,解析成一个NSKeyedUnarchiver对象
NSKeyedUnarchiver *unarchiver= [[NSKeyedUnarchiveralloc]initForReadingWithData:data];
Person *person1 = [unarchiverdecodeObjectForKey:@"person1"];
Person *person2 = [unarchiverdecodeObjectForKey:@"person2"];
// 恢复完毕
[unarchiverfinishDecoding];
l比如对一个Person对象进行深复制
//临时存储person1的数据
NSData *data = [NSKeyedArchiverarchivedDataWithRootObject:person1];
//解析data,生成一个新的Person对象
Student *person2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];
// 分别打印内存地址
NSLog(@"person1:0x%x",person1); // person1:0x7177a60
NSLog(@"person2:0x%x",person2); // person2:0x7177cf0

SQLite3

创建、打开、关闭数据库SQLite3

// path为:~/Documents/person.db
sqlite3 *db;
intresult = sqlite3_open([pathUTF8String], &db); 

执行不返回数据的SQL语句

char *errorMsg;  //用来存储错误信息
char *sql="create table if not exists t_person(id integerprimary key autoincrement, name text,age integer);";
intresult = sqlite3_exec(db, sql, NULL, NULL,&errorMsg);

带占位符插入数据

char *sql="insert into t_person(name, age)values(?, ?);";
sqlite3_stmt*stmt;
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {
    sqlite3_bind_text(stmt, 1, "母鸡", -1,NULL);
    sqlite3_bind_int(stmt, 2, 27);
}
if (sqlite3_step(stmt) != SQLITE_DONE) {
    NSLog(@"插入数据错误");
}
sqlite3_finalize(stmt);

查询数据

char *sql="select id,name,age from t_person;";
sqlite3_stmt*stmt;
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {
    while (sqlite3_step(stmt) == SQLITE_ROW) {
        int _id = sqlite3_column_int(stmt, 0);
        char *_name = (char *)sqlite3_column_text(stmt, 1);
        NSString*name = [NSStringstringWithUTF8String:_name];
        int _age = sqlite3_column_int(stmt, 2);
        NSLog(@"id=%i, name=%@,age=%i", _id,name, _age);
    }
}
sqlite3_finalize(stmt);

Core Data

上一篇 下一篇

猜你喜欢

热点阅读