mirror of
https://github.com/zhigang1992/RestKit.git
synced 2026-04-02 09:31:32 +08:00
82 lines
3.1 KiB
Objective-C
82 lines
3.1 KiB
Objective-C
//
|
|
// RKObjectSeeder.m
|
|
// RestKit
|
|
//
|
|
// Created by Blake Watters on 3/4/10.
|
|
// Copyright 2010 Two Toasters. All rights reserved.
|
|
//
|
|
|
|
#import "RKObjectSeeder.h"
|
|
#import "RKManagedObjectStore.h"
|
|
|
|
@implementation RKObjectSeeder
|
|
|
|
- (id)initWithObjectManager:(RKObjectManager*)manager {
|
|
if (self = [self init]) {
|
|
_manager = [manager retain];
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc {
|
|
[_manager release];
|
|
[super dealloc];
|
|
}
|
|
|
|
- (NSArray*)seedDatabaseWithBundledFile:(NSString*)fileName ofType:(NSString*)type {
|
|
NSError* error = nil;
|
|
NSString* filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:type];
|
|
NSString* payload = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];
|
|
if (nil == error) {
|
|
return [[_manager mapper] mapFromString:payload];
|
|
}
|
|
|
|
return nil;
|
|
}
|
|
|
|
- (void)seedDatabaseWithBundledFiles:(NSArray*)fileNames ofType:(NSString*)type {
|
|
NSLog(@"[RestKit] RKModelSeeder: Seeding database with contents of %d %@ files...", [fileNames count], [type uppercaseString]);
|
|
for (NSString* fileName in fileNames) {
|
|
NSArray* objects = [self seedDatabaseWithBundledFile:fileName ofType:type];
|
|
NSLog(@"[RestKit] RKModelSeeder: Seeded %d objects from %@...", [objects count], [NSString stringWithFormat:@"%@.%@", fileName, type]);
|
|
}
|
|
|
|
[self finalizeSeedingAndExit];
|
|
}
|
|
|
|
- (void)seedObjectsFromFile:(NSString*)fileName ofType:(NSString*)type toClass:(Class)theClass keyPath:(NSString*)keyPath {
|
|
NSError* error = nil;
|
|
NSString* filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:type];
|
|
NSString* payload = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];
|
|
if (nil == error) {
|
|
id objects = [_manager.mapper parseString:payload];
|
|
NSAssert1(objects != nil, @"Unable to parse data from file %@", filePath);
|
|
id parseableObjects = [objects valueForKeyPath:keyPath];
|
|
NSAssert1([parseableObjects isKindOfClass:[NSArray class]], @"Expected an NSArray of objects, got %@", objects);
|
|
NSAssert1([[parseableObjects objectAtIndex:0] isKindOfClass:[NSDictionary class]], @"Expected an array of NSDictionaries, got %@", [objects objectAtIndex:0]);
|
|
|
|
NSArray* mappedObjects = [_manager.mapper mapObjectsFromArrayOfDictionaries:parseableObjects toClass:theClass];
|
|
NSLog(@"[RestKit] RKModelSeeder: Seeded %d objects from %@...", [mappedObjects count], [NSString stringWithFormat:@"%@.%@", fileName, type]);
|
|
} else {
|
|
NSLog(@"Unable to read file %@ with type %@: %@", fileName, type, [error localizedDescription]);
|
|
}
|
|
}
|
|
|
|
- (void)finalizeSeedingAndExit {
|
|
NSError* error = [[_manager objectStore] save];
|
|
if (error != nil) {
|
|
NSLog(@"[RestKit] RKModelSeeder: Error saving object context: %@", [error localizedDescription]);
|
|
}
|
|
|
|
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
|
NSString* basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
|
|
NSString* storeFileName = [[_manager objectStore] storeFilename];
|
|
NSString* destinationPath = [basePath stringByAppendingPathComponent:storeFileName];
|
|
NSLog(@"[RestKit] RKModelSeeder: A Pre-loaded database has been generated at %@. Please copy into Resources/", destinationPath);
|
|
|
|
exit(1);
|
|
}
|
|
|
|
@end
|