前不久用FMDB存過(guò)一點(diǎn)數(shù)據(jù),一條屬性一條屬性的加進(jìn)去的痴晦,會(huì)很麻煩南吮。作為小白當(dāng)然要學(xué)無(wú)止境,所以就參考參考了阅酪。
將對(duì)象存進(jìn)數(shù)據(jù)庫(kù)的blob字段旨袒,先將對(duì)象轉(zhuǎn)換成NSData,對(duì)象要遵守NSCoding協(xié)議术辐,實(shí)現(xiàn)歸檔解檔方法砚尽。
如下例子:
.h 中
@interface Person : NSObject<NSCoding>
@property (nonatomic,copy)NSString *name;
@property (nonatomic,assign)NSInteger age;
@end
.m中
@implementation Person
-(void)encodeWithCoder:(NSCoder *)aCoder
{
unsigned int count=0;
Ivar *ivars=class_copyIvarList([Person class], &count);
for (int i=0; i<count; i++) {
Ivar ivar=ivars[i];
const char *name=ivar_getName(ivar);
NSString *key=[NSString stringWithUTF8String:name];
[aCoder encodeObject:[self valueForKey:key] forKey:key];
}
free(ivars);
}
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self=[super init]) {
unsigned int count=0;
Ivar *ivars=class_copyIvarList([Person class], &count);
for (int i=0; i<count; i++) {
Ivar ivar=ivars[i];
const char *name=ivar_getName(ivar);
NSString *key=[NSString stringWithUTF8String:name];
id value=[aDecoder decodeObjectForKey:key];
[self setValue:value forKey:key];
}
free(ivars);
}
return self;
}
用了一丟丟runtime 如果成員變量不多可以一條條寫(xiě).
然后就可以去搞FMDB了。
NSString *path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
NSString *sqlitePath=[path stringByAppendingPathComponent:@"persons.sqlite"];
self.db=[FMDatabase databaseWithPath:sqlitePath];
if ([self.db open]) {
NSLog(@"---打開(kāi)成功");
//blob是二進(jìn)制對(duì)象
BOOL isCreatTable=[self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_person(id integer PRIMARY KEY, person blob NOT NULL)"];
if (isCreatTable) {
NSLog(@"---創(chuàng)建表成功");
Person *person=[[Person alloc]init];
person.name=@"哇哈哈";
person.age=20;
NSData *data=[NSKeyedArchiver archivedDataWithRootObject:person];
BOOL success=[self.db executeUpdate:@"INSERT INTO t_person(person) VALUES (?);",data];
if (success) {
NSLog(@"插入成功");
}else
{
NSLog(@"插入失敗");
}
}else
{
NSLog(@"---創(chuàng)建表失敗");
}
}else
{
NSLog(@"---打開(kāi)失敗");
}
[self.db close];
這就存進(jìn)去了辉词。
那么我肯定想查一下o不ok必孤。所以..
if ([self.db open]) {
NSLog(@"--打開(kāi)成功!");
FMResultSet *result=[self.db executeQuery:@"SELECT id, person FROM t_person ;"];
while ([result next]) {
NSInteger ID = [result intForColumnIndex:0];
NSData *data=[result objectForColumnName:@"person"];
Person *person=[NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"--hj--%ld %@--%ld",ID,person.name,person.age);
}
}else
{
NSLog(@"---打開(kāi)失斎鹛伞敷搪!");
}
[self.db close];
我查詢結(jié)果是ok 的。
后面我又想幢哨,如果存一堆模型進(jìn)去赡勘,比如tableview cell的數(shù)據(jù)模型,嘗試著放進(jìn)數(shù)組里捞镰,直接存數(shù)組闸与。結(jié)果表明 也是可以的。這時(shí)我就在想是不是放進(jìn)數(shù)組的就能直接存進(jìn)數(shù)據(jù)庫(kù)呢岸售?畢竟我是一個(gè)小白(屌大的不要bb我)践樱,我存了沒(méi)遵守協(xié)議的Model進(jìn)數(shù)組,再把數(shù)組存到數(shù)據(jù)庫(kù)凸丸,結(jié)果就崩咯拷邢。所以說(shuō)還是都要遵守NSCoding協(xié)議的。
----------