Core data iOS核心数据:对象未永久保存在sqlite中

Core data iOS核心数据:对象未永久保存在sqlite中,core-data,Core Data,我试图做的是解析一个json,从解析的数组中创建managedObject并将它们保存到数据库中。然后,使用生成的sqlite数据库作为预加载数据库 这就是我预加载数据的方式,self.busstops、self.addresses、self.busroutes和self.busservice是从json文件解析的数组 - (void)preloadData { [self.busstops enumerateObjectsUsingBlock:^(id obj, NSUInteger

我试图做的是解析一个json,从解析的数组中创建managedObject并将它们保存到数据库中。然后,使用生成的sqlite数据库作为预加载数据库

这就是我预加载数据的方式,self.busstops、self.addresses、self.busroutes和self.busservice是从json文件解析的数组

- (void)preloadData
{
    [self.busstops enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        BusStop *busstop = [NSEntityDescription insertNewObjectForEntityForName:@"BusStop"
                                                     inManagedObjectContext:[self managedObjectContext_busstop]];
        busstop.bus_stop_id = [obj objectForKey:@"bus_stop_id"];
        busstop.road = [obj objectForKey:@"road"];
        busstop.desc = [obj objectForKey:@"description"];
        busstop.lat = [obj objectForKey:@"lat"];
        busstop.lng = [obj objectForKey:@"lng"];
        busstop.index = (busstop.desc && busstop.desc.length > 0) ? [busstop.desc substringToIndex:1] : @"-";

        NSError *error;
        if (![[self managedObjectContext_busstop] save:&error])
            NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
    }];

    [self.addresses enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        Address *address = [NSEntityDescription insertNewObjectForEntityForName:@"Address"
                                                     inManagedObjectContext:[self managedObjectContext_address]];
        address.address_id = @(idx);
        address.block = [obj objectForKey:@"block"];
        address.road = [obj objectForKey:@"road"];
        address.postal_code = [obj objectForKey:@"postal_code"];
        address.building = [obj objectForKey:@"building"];
        address.lat = [obj objectForKey:@"lat"];
        address.lng = [obj objectForKey:@"lng"];
        address.full_road = (address.block && address.block.length > 0) ?
        [NSString stringWithFormat:@"%@, %@", address.block, address.road] :
        [NSString stringWithFormat:@"%@", address.road];
        address.index = (address.building && address.building.length > 0) ? [address.building substringToIndex:1] : @"-";

        NSError *error;
        if (![[self managedObjectContext_address] save:&error])
            NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
    }];

    [self.busroutes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSString *bus_service_num = [obj objectForKey:@"bus_service"];
        NSString *bus_type = [obj objectForKey:@"bus_type"];
        NSArray *routes = [obj objectForKey:@"routes"];

        [routes enumerateObjectsUsingBlock:^(id route, NSUInteger route_idx, BOOL  *route_stop) {
            NSNumber *bus_dir = [route objectForKey:@"direction"];
            NSArray *bus_routes = [route objectForKey:@"bus_route"];

            [bus_routes enumerateObjectsUsingBlock:^(id busstop, NSUInteger busstop_idx, BOOL *busstop_stop) {
                NSString *bus_stop_id = [busstop objectForKey:@"bus_stop_id"];
                NSNumber *route_seq = [busstop objectForKey:@"route_seq"];
                NSString *stop_distance = [busstop objectForKey:@"stop_distance"];
                NSDictionary *first_bus = [[busstop objectForKey:@"first_bus"] firstObject];
                NSDictionary *last_bus = [[busstop objectForKey:@"last_bus"] firstObject];

                BusRoute *busroute = [NSEntityDescription insertNewObjectForEntityForName:@"BusRoute"
                                                               inManagedObjectContext:    [self managedObjectContext_busroutes]];
                busroute.bus_service_num = bus_service_num;
                busroute.bus_dir = bus_dir;
                busroute.route_seq = route_seq;
                busroute.stop_distance = stop_distance;
                busroute.first_wd = [first_bus objectForKey:@"weekday"];
                busroute.last_wd = [last_bus objectForKey:@"weekday"];
                busroute.first_sat = [first_bus objectForKey:@"sat"];
                busroute.last_sat = [last_bus objectForKey:@"sat"];
                busroute.first_sun = [first_bus objectForKey:@"sun"];
                busroute.last_sun = [last_bus objectForKey:@"sun"];
                busroute.bus_stop_id = bus_stop_id;
                busroute.bus_type = bus_type;

                NSError *error;
                if (![[self managedObjectContext_busroutes] save:&error])
                    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
            }];
        }];
    }];

    [self.busservice enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        BusService *bus_service = [NSEntityDescription insertNewObjectForEntityForName:@"BusService"
                                                            inManagedObjectContext:[self managedObjectContext_busservice]];
        bus_service.bus_service_num = obj[@"bus_service"];
        bus_service.bus_type = obj[@"bus_type"];

        NSError *error;
        if (![[self managedObjectContext_busservice] save:&error])
            NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
    }];
}
以下是我的managedObject_上下文的编码方式:

- (NSManagedObjectContext *)managedObjectContext_busstop
{
    if (_managedObjectContext_busstop != nil)
        return _managedObjectContext_busstop;

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
        _managedObjectContext_busstop = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
        [_managedObjectContext_busstop setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext_busstop;
}

- (NSManagedObjectContext *)managedObjectContext_address
{
    if (_managedObjectContext_address != nil)
        return _managedObjectContext_address;

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
        _managedObjectContext_address = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
        [_managedObjectContext_address setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext_address;
}

- (NSManagedObjectContext *)managedObjectContext_busroutes
{
    if (_managedObjectContext_busroutes != nil)
        return _managedObjectContext_busroutes;

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
        _managedObjectContext_busroutes = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
        [_managedObjectContext_busroutes setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext_busroutes;
}

- (NSManagedObjectContext *)managedObjectContext_busservice
{
    if (_managedObjectContext_busservice != nil)
        return _managedObjectContext_busservice;

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
        _managedObjectContext_busservice = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
        [_managedObjectContext_busservice setPersistentStoreCoordinator:coordinator];
    }
   return _managedObjectContext_busservice;
}

- (NSManagedObjectModel *)managedObjectModel
{
    if (_managedObjectModel != nil)
       return _managedObjectModel;

    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"SMRTConnectCD" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil)
        return _persistentStoreCoordinator;

    NSURL *applicationDocumentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    NSURL *storeURL = [applicationDocumentsDirectory URLByAppendingPathComponent:@"SMRTConnectCD.sqlite"];

    NSLog(@"store: %@", storeURL);

    if (!self.preloadEnabled)
    {
        if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]])
        {
            NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"SMRTConnect_preload" ofType:@"sqlite"]];

            NSError* err = nil;

            if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&err])
                NSLog(@"Oops, could not copy preloaded data");
        }
    }

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _persistentStoreCoordinator;
}
经过这些处理后,当我转到应用程序的另一部分时,我可以看到表中列出的所有公交车服务。然而,当我复制生成的sqlite文件并用firefox的SQLItemManager打开它时,总线服务表要么是空的,要么是不完整的,缺少一些条目


我已经仔细检查了我的代码,老实说,我不知道我的代码出了什么问题。

在iOS 7上,核心数据使用SQLite的wal模式日志记录,因此任何存储文件foo.SQLite都有两个名为foo.SQLite-wal和foo.SQLite-shm的关联文件。如果不复制这三个文件,就无法获取数据。

因此,如果我的目标是重命名生成的文件并将其移动到其他位置,如SMRTConnect_preload.sqlite,那么我还应该重命名并移动其他两个文件?