今天遇到一个问题,把NSData类型存到数据库,但是之前没有这么干过,所以也不知道是怎么操作的。
之前往数据库里存的都是int、 NSString这种类型,对应的就是C语言的int 、和字符串。
NSString 是OC的对象类型,想存数据库,必须先转一下再存,例如:[str UTF8String] 这样转成const char* 就可以赋值了
但是NSDate对应的是什么类型呢?
NSDate 对应的是我们平时很不常用的 bytes 类型,我一时没记起来,这不赖我········
好吧,我还是觉得代码比较直接,上代码
插入的时候:
#program -mark 这是插入的方法,参数为两个字段的内容,第二个是data类型
+ (BOOL)insertClassification:(NSString *)Classification AndData:(NSData *)data
{
//插入语句
NSString *insertClassification=@"insert into Commodity(CommodityClassification,JSON) values(?,?)";
sqlite3 *db=[self openDB];
sqlite3_stmt *stmt=nil;
int stat=sqlite3_prepare_v2(db, [insertClassification UTF8String], -1, &stmt, nil);
if (stat==SQLITE_OK) {
sqlite3_bind_text(stmt, 1, [Classification UTF8String], -1, NULL);
// 用data 调用bytes函数,并且获得长度。这里的长度一定要设置,不然的话数据会不正确
sqlite3_bind_blob(stmt, 2, [data bytes], (int)[data length] , NULL);
//好了,这一步就绑定了,是不是也挺简单的
int result = sqlite3_step(stmt);
if (result==SQLITE_DONE) {
//进到该if语句说明已经添加成功
return YES;
}
}
return NO;
}
查询的时候:
+ (NSMutableDictionary *)selectClassification:(NSString *)Classification
{
NSMutableDictionary *dic=[[NSMutableDictionary alloc]init];
NSString *selectClassification=@"select * from Commodity where CommodityClassification like ?";
sqlite3 *db=[self openDB];
sqlite3_stmt *stmt=nil;
int stat=sqlite3_prepare_v2(db, [selectClassification UTF8String], -1, &stmt, nil);
if (stat==SQLITE_OK) {
sqlite3_bind_text(stmt, 1, [Classification UTF8String], -1, nil);
while (SQLITE_ROW==sqlite3_step(stmt)) {
//得到记录中的BLOB字段
const void * test = sqlite3_column_blob(stmt, 2);
//得到字段中数据的长度
int size = sqlite3_column_bytes(stmt, 2);
//根据字节和长度得到data对象
NSData *data = [[NSData alloc]initWithBytes:test length:size];
[dic setObject:data forKey:Classification];
}
}
return dic;
}
就是这样,data可以是任何类型的数据,可以存图片视频、音频等等,这样也是蛮灵活的