すべてのオブジェクトをデータベースに保存

2254 ワード

もとの住所


ディクショナリまたは配列を直接データベースに格納すると、配列またはディクショナリが文字列に変換されるため、アーカイブおよび逆アーカイブを使用してデータを符号化およびバイナリデータに復号して格納できますが、データベースでは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

ViewControlで


データベースの初期化

// 
-(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);
    }
}

サンプルコード