尝试通过Core Data保存文档窗口维度

时间:2009-12-29 13:08:30

标签: objective-c cocoa core-data

我正在尝试通过Core Data保存文档窗口的尺寸。我使用以下代码来保存宽度和高度:

managedObjectContext = [[[NSDocumentController sharedDocumentController] currentDocument] managedObjectContext];

NSSize windowSize;
windowSize.width = documentWindow.frame.size.width;
windowSize.height = documentWindow.frame.size.height;

SizeInfo *windowInfo = (SizeInfo *)[NSEntityDescription insertNewObjectForEntityForName:@"SizeInfo" inManagedObjectContext:managedObjectContext];

[windowInfo setWidth:[NSString stringWithFormat:@"%f", windowSize.width]];
[windowInfo setHeight:[NSString stringWithFormat:@"%f", windowSize.height]];

NSLog (@"Width = %f, Height = %f", windowInfo.width, windowInfo.height);

我使用以下代码来获取相同的信息:

managedObjectContext = [self managedObjectContext];

NSArray *array = [MyDocument objectsForEntityNamed:@"SizeInfo" inContext:managedObjectContext];
NSLog (@"%@", [array objectAtIndex:0]);

第二行的fetch方法在我的代码中调用以下方法:

+ (NSArray *)objectsForEntityNamed:(NSString *)name inContext:(NSManagedObjectContext *)context
{
NSEntityDescription *entity = [NSEntityDescription entityForName:name inManagedObjectContext:context];

NSFetchRequest *req = [[NSFetchRequest alloc] init];    
[req setEntity:entity];

NSError *error = nil;

NSArray *array = [context executeFetchRequest:req error:&error];

if (array == nil)
{
    NSException *exception = [NSException 
                              exceptionWithName:self 
                              reason:[error localizedDescription] 
                              userInfo:nil];


    [req release];
    [exception raise];
}

[req release];

return array;
}

当我尝试获取信息时,收到以下错误:

*** -[NSArray objectAtIndex:]: index (0) beyond bounds (0)

在调试时,看来我有一个初始化数组,其中包含0个对象。

有没有人在这里看到任何东西我可能需要修理以使工作正常?

提前致谢。 瑞奇。

1 个答案:

答案 0 :(得分:1)

首先,当Core Data本身支持数字时,您将数字存储为字符串。

其次,使用类方法来执行获取而不是实例方法是很奇怪的。实例方法可以使用NSPersistentDocument的-managedObjectContext,而不是要求传递一个的参数:

- (NSArray *)objectsForEntityWithName:(NSString *)name
{    
    NSManagedObjectContext *context = [self managedObjectContext];
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];    
    [request setEntity:[NSEntityDescription entityForName:name
                                   inManagedObjectContext:context]];

    NSError *error = nil;
    NSArray *results = [context executeFetchRequest:request error:&error];
    if (!results)
    {
        [NSApp presentError:error];
        return nil;
    }

    return results;
}

但是,我不会使用这样的通用提取方法。相反,我会编写用于检索特定数据的实例方法,例如从上下文中检索数据的-(NSSize)documentWindowSize方法,并将其作为NSSize结构返回给我。

很难准确地诊断为什么你的获取请求返回零结果而不知道何时调用这些代码片段。在程序中运行插入代码和获取代码的位置和时间?我假设在NSPersistentDocument子类之外调用大小保存代码,因为您必须通过共享文档控制器来获取上下文。

在任何情况下,我都会让文档类在其文档窗口中注册窗口大小更改通知,并将新大小保存在其监听方法中。