проблема coredata nsurl может не отвечать на stringByAppendingPathComponent - PullRequest
4 голосов
/ 11 февраля 2011

У меня были некоторые проблемы после запуска нового проекта coredata с xcode 3.2.5 ... мои предыдущие проекты с базовыми данными (в предыдущем xcode) работали нормально, поэтому я не знаю, в чем разница ??

поэтому ошибка, которую я получаю при сборке и переходе к представлению, которое вызывает основные данные:>

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '***  -[NSURL initFileURLWithPath:]: nil string parameter'

странно то, что в моем * AppDelegate.m, в (отредактировано спасибо Рог, но все еще не работает!)

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

if (persistentStoreCoordinator_ != nil) {
    return persistentStoreCoordinator_;
}   

NSString *storePath = [[self applicationDocumentsDirectory]   stringByAppendingPathComponent: @"staff.sqlite"];

NSURL *storeUrl = [NSURL fileURLWithPath:storePath]; //new position for the storeUrl!    

// Put down default db if it doesn't already exist
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:storePath]) {
    NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"staff" ofType:@"sqlite"];
    if (defaultStorePath) {
        [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
    }
}

в

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"staff.sqlite"];

Я получаю предупреждение

NSURL may not respond to '-stringByAppendingPathComponent'

I вариант + щелкните эту строкуByAppendingPathComponent и получите (символ не найден !!!!)

но в других проектах я делаю вариант + нажимаю на него и получаю определение !!

  • так это предупреждение связано с моей ошибкой ??
  • как это исправить ???

Редактировать, включил это в мой viewDidLoad

NSLog (@ "path =% @", [NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES) lastObject]);

, что дает мне в консоли:

path= /Users/mkss9/Library/Application Support/iPhone Simulator/4.2/Applications/2F364C20-2B87-4ABB-AA3E-FB6F7C15096F/Documents

пожалуйста !, я схожу с ума !!

спасибо!

Ответы [ 3 ]

7 голосов
/ 11 февраля 2011

Некоторые версии SDK назад (я точно не знаю, когда они это сделали), Apple изменила тип возврата applicationDocumentsDirectory в своих шаблонах проектов.

Когда вы создаете новый проект, он выглядит так:

/**
 Returns the URL to the application's Documents directory.
 */
- (NSURL *)applicationDocumentsDirectory {
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

в старых шаблонах это выглядело следующим образом:

/**
 Returns the path to the application's documents directory.
 */
- (NSString *)applicationDocumentsDirectory {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}

, а между этими двумя шаблонами это выглядело так:осторожно, потому что весь старый код, который использует applicationDocumentsDirectory, возвращающий NSString, не будет работать с более новыми шаблонами.

И вы не можете просто заменить новую версию более старой, потому что это приведет к изменениюваши основные методы данных.

Поэтому я бы предложил вам написать собственный метод для возврата каталога документов.Apple меняет их applicationDocumentsDirectory довольно часто.

1 голос
/ 11 февраля 2011

Я думаю, это потому, что -applicationDocumentsDirectory возвращает NSURL * вместо NSString *.

0 голосов
/ 11 февраля 2011

Во-первых, вам нужно убедиться, что applicationDocumentsDirectory метод возвращает NSString.

Если это не так, последующее падение происходит потому, что вы передаете путь и имя файла, которые еще не существуют.

Так что если вы переместите свой NSURL *storeUrl = [NSURL fileURLWithPath:storePath]; после кода, который проверяет существующий файл и устанавливает файл по умолчанию, если он не существует, это должно решить вашу проблему.

...