定义Person类 遵守NSCoding协议,并实现归档方法
----*** .h文件 ***----
@interface Person : NSObject<NSCoding>
@property (copy,nonatomic)NSString *name;
@property(copy,nonatomic)NSString *phone;
@end
----*** .m文件 ***----
@implementation Person
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.phone forKey:@"phone"];
}
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.phone = [aDecoder decodeObjectForKey:@"phone"];
}
return self;
}
@end
创建person对象并添加到数据库
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
path = [path stringByAppendingString:@"/fmdb.sqlite"];
NSLog(@"%@",path);
FMDatabase *db = [FMDatabase databaseWithPath:path];
//打开数据库
if (![db open]) {
return;//打不开就结束
}
创建数据表
NSString *creatTable = [NSString stringWithFormat:@"create table user (name text primary key,person blob)"];
//执行创建数据表语句
BOOL result1 = [db executeUpdate:creatTable];
if (result1) {
NSLog(@"creat success");
}
将person对象插入数据库
Person *person = [[Person alloc] init];
person.name = @"名字";
person.phone = @"15015228653";
/*
注意事项
1. 使用“ ? ”赋值不能通过 stringWithFormat 直接赋值, 如下面的方式(1)
2. 如果用stringWithFormat。就不能直接在后面给定参数,而应该通过在后面赋值(2)
(1). 错误: NSString *insertData = [NSString stringWithFormat: @"insert into user ('name','person') values(?,?);",person.name,data];
(2). NSString *selectData = [NSString stringWithFormat:@"select *from user where name = ?"];
*/
//插入数据 /* 一 通过类方法 归档 */
BOOL result2 = [db executeUpdate:@"insert into user ('name','person') values(?,?);",person.name,[NSKeyedArchiver archivedDataWithRootObject:person]];
/* 二 通过创建对象 归档*/
// 创建归档对象
// NSMutableData *data = [NSMutableData data];
// NSKeyedArchiver *archive = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
// [archive encodeObject:person forKey:@"person"];
// [archive finishEncoding];
// BOOL result2 = [db executeUpdate:@"insert into user ('name','person') values(?,?);",person.name,data];
if (result2) {
NSLog(@"insert success");
}
查询 读取person
FMResultSet *set = [db executeQuery:[NSString stringWithFormat:@"select *from user where name = '%@'",@"名字"]];
if ([set next]) {
NSData *personData = [set dataForColumn:@"person"];
/* 一 、 通过类方法 反归档 与前面插入的方式对应 */
Person *p = [NSKeyedUnarchiver unarchiveObjectWithData:personData];
/* 二 、 通过创建对象 反归档*/
// NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:personData];
// Person *p = [unarchiver decodeObjectForKey:@"person"];
//结束反归档
// [unarchiver finishDecoding];
NSLog(@"person p.name:%@,p.phone:%@",p.name,p.phone);
}
关闭数据库
[db close];