将自定义类添加到到数据库FMDB

定义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 直接赋值, 如下面的方式(12. 如果用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];
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值