核心数据设置、保存重复项和返回空对象
Core Data Set Up, Saving Duplicates and Returning Empty Objects
通过修复问题 1 回答了问题 2,如果您知道原因,请随时解释
完全公开,我涉足 Objective C 所以这可能很明显,但我找不到类似的问题或更准确地回答类似的问题。
我正在编写一个非常简单的应用程序,我正在学习核心数据,但我有几个问题
Q.1 已回答,这里是 Q.2
Q2。从 Core Data 获取时,我检索到空对象?
Data Controller 与我调用的上述问题相同
- (NSMutableArray*) returnTimers
{
[self initilizeDataLayer];
NSMutableArray *listOfTimers = [[NSMutableArray alloc]init];
NSFetchRequest *request = [[NSFetchRequest alloc]initWithEntityName:@"Timer"];
NSError *error = nil;
NSArray *listOfTimersRaw = [myDataController.managedObjectContext executeFetchRequest:request error:&error];
if (error != nil) {
//Deal with failure
}
else {
//Deal with success
listOfTimers = [NSMutableArray arrayWithArray:listOfTimersRaw];
}
return listOfTimers;
}
这正确地检索了 2 个对象,但它们是空的?
同样,这是实验,所以可能是屁股方法,但我必须以某种方式学习......任何帮助将不胜感激。
以下已得到答复,谢谢
Q1。将对象保存到核心数据会在 sqlite 数据库中创建一个空白行 - 为什么?
我已经像 Apple 文档中那样设置了一个 DataController 对象
- (void)initializeCoreData
{
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"WorkRestWork" withExtension:@"momd"];
NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSAssert(mom != nil, @"Error initializing Managed Object Model");
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[moc setPersistentStoreCoordinator:psc];
[self setManagedObjectContext:moc];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentsURL = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *storeURL = [documentsURL URLByAppendingPathComponent:@"WorkRestWork.sqlite"];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
NSError *error = nil;
NSPersistentStoreCoordinator *psc = [[self managedObjectContext] persistentStoreCoordinator];
NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:_options error:&error];
NSAssert(store != nil, @"Error initializing PSC: %@\n%@", [error localizedDescription], [error userInfo]);
});
}
然后我调用这个方法
- (BOOL) addTimerWithName: (NSString*)timerName
{
[self initilizeDataLayer];
Timer *newTimer = [NSEntityDescription insertNewObjectForEntityForName:@"Timer" inManagedObjectContext:myDataController.managedObjectContext];
newTimer = [NSEntityDescription insertNewObjectForEntityForName:@"Timer" inManagedObjectContext:myDataController.managedObjectContext];
newTimer.name = timerName;
[myDataController.managedObjectContext insertObject:newTimer];
NSError *error = nil;
if ([myDataController.managedObjectContext save:&error] == NO) {
NSAssert(NO, @"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
return NO;
}
return YES;
}
最后
[cdh addTimerWithName:@"A TEST"];
当我使用 Base 检查 .sqlite 文件时,有 2 行,一行的名称为 "A TEST",另一行为空,这让我感到困惑
广告 Q1。
您在此处插入两个计时器。但是,您只为第二个分配了一个名称。第一个没有名字,因为您从未设置过它。这是带有一些注释的代码:
// Inserts first timer
Timer *newTimer = [NSEntityDescription insertNewObjectForEntityForName:@"Timer" inManagedObjectContext:myDataController.managedObjectContext];
// Inserts second timer
newTimer = [NSEntityDescription insertNewObjectForEntityForName:@"Timer" inManagedObjectContext:myDataController.managedObjectContext];
// Sets name of the second timer
newTimer.name = timerName;
通过修复问题 1 回答了问题 2,如果您知道原因,请随时解释
完全公开,我涉足 Objective C 所以这可能很明显,但我找不到类似的问题或更准确地回答类似的问题。
我正在编写一个非常简单的应用程序,我正在学习核心数据,但我有几个问题
Q.1 已回答,这里是 Q.2
Q2。从 Core Data 获取时,我检索到空对象?
Data Controller 与我调用的上述问题相同
- (NSMutableArray*) returnTimers
{
[self initilizeDataLayer];
NSMutableArray *listOfTimers = [[NSMutableArray alloc]init];
NSFetchRequest *request = [[NSFetchRequest alloc]initWithEntityName:@"Timer"];
NSError *error = nil;
NSArray *listOfTimersRaw = [myDataController.managedObjectContext executeFetchRequest:request error:&error];
if (error != nil) {
//Deal with failure
}
else {
//Deal with success
listOfTimers = [NSMutableArray arrayWithArray:listOfTimersRaw];
}
return listOfTimers;
}
这正确地检索了 2 个对象,但它们是空的?
同样,这是实验,所以可能是屁股方法,但我必须以某种方式学习......任何帮助将不胜感激。
以下已得到答复,谢谢
Q1。将对象保存到核心数据会在 sqlite 数据库中创建一个空白行 - 为什么?
我已经像 Apple 文档中那样设置了一个 DataController 对象
- (void)initializeCoreData
{
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"WorkRestWork" withExtension:@"momd"];
NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSAssert(mom != nil, @"Error initializing Managed Object Model");
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[moc setPersistentStoreCoordinator:psc];
[self setManagedObjectContext:moc];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentsURL = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *storeURL = [documentsURL URLByAppendingPathComponent:@"WorkRestWork.sqlite"];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
NSError *error = nil;
NSPersistentStoreCoordinator *psc = [[self managedObjectContext] persistentStoreCoordinator];
NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:_options error:&error];
NSAssert(store != nil, @"Error initializing PSC: %@\n%@", [error localizedDescription], [error userInfo]);
});
}
然后我调用这个方法
- (BOOL) addTimerWithName: (NSString*)timerName
{
[self initilizeDataLayer];
Timer *newTimer = [NSEntityDescription insertNewObjectForEntityForName:@"Timer" inManagedObjectContext:myDataController.managedObjectContext];
newTimer = [NSEntityDescription insertNewObjectForEntityForName:@"Timer" inManagedObjectContext:myDataController.managedObjectContext];
newTimer.name = timerName;
[myDataController.managedObjectContext insertObject:newTimer];
NSError *error = nil;
if ([myDataController.managedObjectContext save:&error] == NO) {
NSAssert(NO, @"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
return NO;
}
return YES;
}
最后
[cdh addTimerWithName:@"A TEST"];
当我使用 Base 检查 .sqlite 文件时,有 2 行,一行的名称为 "A TEST",另一行为空,这让我感到困惑
广告 Q1。 您在此处插入两个计时器。但是,您只为第二个分配了一个名称。第一个没有名字,因为您从未设置过它。这是带有一些注释的代码:
// Inserts first timer
Timer *newTimer = [NSEntityDescription insertNewObjectForEntityForName:@"Timer" inManagedObjectContext:myDataController.managedObjectContext];
// Inserts second timer
newTimer = [NSEntityDescription insertNewObjectForEntityForName:@"Timer" inManagedObjectContext:myDataController.managedObjectContext];
// Sets name of the second timer
newTimer.name = timerName;