原帖地址
如果將字典或數組直接存儲在數據庫中,會將數組或字典轉化成字符串,所以可以使用歸檔與反歸檔的方法將數據進行編碼和解碼成二進制數據進行存儲,而在數據庫中需要使用blob類型存儲二進制數據。
如下面的例子:
在Shop.m中
#import "Shop.h"
@implementation Shop
#pragma mark 編碼
-(void)encodeWithCoder:(NSCoder *)enCoder {
[enCoder encodeObject:self.name forKey:@"name"];
[enCoder encodeDouble:self.price forKey:@"price"];
}
#pragma mark 解碼
- (instancetype)initWithCoder:(NSCoder *)decoder
{
self = [super init];
if (self) {
self.name = [decoder decodeObjectForKey:@"name"];
self.price = [decoder decodeDoubleForKey:@"price"];
}
return self;
}
-(NSString *)description {
return [NSString stringWithFormat:@"%@--%f",self.name, self.price];
}
@end
在ViewController中
初始化數據庫
//初始化數據庫
-(void)initDatabase {
//初始化
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"shop.sqlite"];
self.db = [FMDatabase databaseWithPath:path];
[self.db open];
//創表
//數據庫中blob是二進制對象
[self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_shop(id integer PRIMARY KEY, shop blob NOT NULL)"];
}
添加數據
//添加數據
- (void)addShops {
for (int i = 0; i < 1000; i++) {
Shop *shop = [[Shop alloc] init];
shop.name = [NSString stringWithFormat:@"商品--%d", i];
shop.price = arc4random() % 10000;
//要將一個對象存進數據庫的blob字段,最先轉化為NSData
//一個對象要遵守NSCoding協議,實現協議中相應的方法,才能轉化為NSData
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:shop];
[self.db executeUpdateWithFormat:@"INSERT INTO t_shop(shop) VALUES (%@);",data];
}
}
讀取數據
// 讀取數據
-(void)readShos {
FMResultSet *set = [self.db executeQuery:@"SELECT * FROM t_shop LIMIT 10;"];
while (set.next) {
NSData *data = [set objectForColumnName:@"shop"];
Shop *shop = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"%@---%f",shop.name, shop.price);
}
}