怎么向数据库中存取data的数据

来源:互联网 发布:网络红人妖妃娘娘 编辑:程序博客网 时间:2024/04/20 10:11

iOS中操作数据库可以很方便的存取数据,怎么打开关闭数据库,数据库的增删改查就不做赘述,数据库插入data比较特殊(data的存储类型为blob(二进制))拿出来单独分享一下.
一般插入的data都是有model归档的数据,这样就能很方面整体操作model
例如.有一个Perso类,属性为(ID, name, gender, age),实例化出来一个对象,然后把该对象进行归档
1.首先把归档写成一个方法,在数据插入的时候调用

// 归档- (NSData *)dataOfArchiverObject:(id)object forKey:(NSString *)key{    NSMutableData *data = [NSMutableData data];    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];    [archiver encodeObject:object forKey:key];    [archiver finishEncoding];    [archiver release];    return data;}}

2.然后把数据库的插入写成一个方法

- (void)insertWithPerson:(Person *)person{  // 打开数据库    db = [self openDataBase];    // 声明跟随指针    sqlite3_stmt *stmt = nil;    // 将ID和person一起插入数据库     NSString *sql = @"insert into PersonList (ID, data) values (?, ?)";    int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);    if (result == SQLITE_OK) {       NSLog(@"添加成功");      // 绑定                sqlite3_bind_text(stmt, 1, person.ID.UTF8String, -1, NULL);        // 将person先进行归档转化为data,用ID最为键值        NSData *data = [[FileHandle shareInstance] dataOfArchiverObject:person forKey:person.ID];        // 因为data比较特殊,第三个参数长度的时候不能用-1,必须写data的实际长度         sqlite3_bind_blob(stmt, 4, [data bytes],(int)[data length], NULL);         // 释放跟随指针         sqlite3_finalize(stmt);    } else {        NSLog(@"添加失败");    }    // 关闭数据库  [self closeDataBase];}

3.取出插入的data,首先也是先写反归档的方法

// 反归档- (id)unarchiverObject:(NSData *)data forKey:(NSString *)key{    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];    id object = [unarchiver decodeObjectForKey:key];    [unarchiver finishDecoding];    return object;}

4.根据ID取出数据库中的data

- (Person *)queryPersonWithID:(NSString *)ID{  db = [self openDataBase];    NSString *sql = [NSString stringWithFormat:@"select data from PersonList where ID = '%@'", ID];    sqlite3_stmt *stmt = nil;    int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);    Person *model = nil;    if (result == SQLITE_OK) {        NSLog(@"查询成功");        sqlite3_bind_text(stmt, 1, ID.UTF8String, -1, NULL);        while (sqlite3_step(stmt) == SQLITE_ROW) {            NSData *data = [NSData dataWithBytes:sqlite3_column_blob(stmt, 0) length:sqlite3_column_bytes(stmt, 0)];    // 反归档把model取出来                    model = [[FileHandle shareInstance] unarchiverObject:data forKey:ID];        }    } else {       NSLog(@"查询失败");    }    sqlite3_finalize(stmt);    [self closeDataBase];    return model;}

这样可以在数据中很方面整体存取data了


0 0
原创粉丝点击