未插入 CoreData 对象

Posted

技术标签:

【中文标题】未插入 CoreData 对象【英文标题】:CoreData objects not inserted 【发布时间】:2013-08-17 21:56:34 【问题描述】:

插入Core Data 突然停止工作。 我使用以下代码设置了我的persistentStoreCoordinator。注意urlSpot.sqlite

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

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Spot.sqlite"];
    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;

我运行应用程序,然后执行

cd ~/Library/Application Support/iPhone Simulator/7.0/Applications
find . -name MyAppName
A1DF7916-AE39-4367-BFD2-22A8BAA2AFD2
cd A1DF7916-AE39-4367-BFD2-22A8BAA2AFD2/Documents
ls 
(results) Spot.sqlite                       Spot.sqlite-shm                   Spot.sqlite-wal
sqlite3 Spot.sqlite
sqlite> .tables
ZMYCATEGORY   Z_METADATA    Z_PRIMARYKEY
sqlite> select * from ZMYCATEGORY;

这没有显示任何结果,但是当我选择Z_METADATA 的内容时,我确实得到了一行输出。

这是我用来在托管对象上下文中插入对象的代码:

+ (void)insertParentCategoriesIntoCoreDataFromArray:(NSArray *)array 
    ROAppDelegate *delegate = (ROAppDelegate *)[UIApplication sharedApplication].delegate;
    NSManagedObjectContext *managedObjectContext = [delegate managedObjectContext];

    NSEntityDescription *categoryEntity = [NSEntityDescription entityForName:@"ROCategory" inManagedObjectContext:managedObjectContext];

    for (int i = 0; i < [array count]; i++) 
        ROCategory *category = [[ROCategory alloc] initWithEntity:categoryEntity insertIntoManagedObjectContext:managedObjectContext];
        NSArray *mysqlRow = [array objectAtIndex:i];
        NSString *name = [mySQLRow objectAtIndex:1];
        [category setValue:name forKey:@"name"];
    

当我单步执行这段代码时,它会按预期执行。不会发生错误。然而相关的 sqlite 表仍然是空的,当我运行以下代码时,我得到一个空的结果集。

            ...
            NSFetchRequest *request = [[NSFetchRequest alloc] init];
            request.predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"name ==[c] \'%@\'", key]]; // the [c] means case-sensitive
            [request setEntity:categoryEntity];

            NSError *error;
            fetchedObjects = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];  

【问题讨论】:

【参考方案1】:

我忘了save

我包含了这段代码并且它起作用了:

NSError *error = nil;
if (![[((ROAppDelegate *)[UIApplication sharedApplication].delegate) managedObjectContext] save:&error]) 
    // error                                         

【讨论】:

这里有一个提示:回调到您的 App Delegate 以获取托管对象上下文会让您看起来像个菜鸟。通过堆栈向上传递上下文。当您开始使用多个上下文时,您会发现这更有意义。 不是在堆栈中传递上下文,而是创建一个单例持久性控制器来处理 Core Data 堆栈的膨胀和一个返回临时上下文以使用的 getter,并可能是另一种方便的方法来保存父上下文也取决于你如何设计你的上下文关系。

以上是关于未插入 CoreData 对象的主要内容,如果未能解决你的问题,请参考以下文章

字符串的最后一部分未插入 coredata

将新对象插入 coreData

在CoreData的NSOrderedSet中的特定位置插入一个对象?

CoreData 只保存最近插入的对象

CoreData:从字典数组插入到SQLite数据库中发生未排序 - 因此无法设置外键

在看似随机的列表位置插入 CoreData 对象