Ошибка основных данных iPhone - PullRequest
0 голосов
/ 22 января 2012

Мое приложение имеет несколько контроллеров представления. В моем VehicleListController я сохраняю данные в основные данные. А в FavouritesController я извлекаю данные из основных данных, чтобы отобразить их в виде таблицы.

Я получаю эту ошибку при проверке таблицы favouritesController для просмотра основных данных.

'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'Favouritesdata''

Имя объекта - Favouritesdata.

В методе делегата приложения didFinishLaunchingWithOptions имеет значение

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *user = [defaults objectForKey:@"Username"];
NSString *passwd = [defaults objectForKey:@"Password"];

if ((user != nil) && (passwd != nil)) {

    NSLog(@"Data found");

    self.progressView = [[Progressbar alloc] initWithNibName:@"Progressbar" bundle:nil];
    self.window.rootViewController = self.progressView;
    [self.window makeKeyAndVisible];

}
else {

    NSLog(@"No data saved");

    self.viewController = [[VektorViewController alloc] initWithNibName:@"VektorViewController" bundle:nil];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
}

return YES;}

В favouritesController.m для получения данных

-(void)getData {

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Favouritesdata" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setFetchBatchSize:20];
[request setEntity:entity];
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"licensePlate" ascending:YES];
NSArray *newArray = [NSArray arrayWithObject:sort];
[request setSortDescriptors:newArray];
NSError *error;
NSMutableArray *results = [[context executeFetchRequest:request error:&error] mutableCopy];
[self setLicensePlateArray:results];
[self.favouritesTable reloadData];
}

И в cellForRowAtIndexPath в избранныхКонтроллер

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";  

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

    UILongPressGestureRecognizer *pressRecongnizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(tableCellPressed:)];
    pressRecongnizer.minimumPressDuration = 0.5f;
    [cell addGestureRecognizer:pressRecongnizer];
    [pressRecongnizer release];
}

Favouritesdata *favdata = [licensePlateArray objectAtIndex:indexPath.row];

NSLog(@"favdata: %@", favData);

if ([tableView isEqual:self.searchDisplayController.searchResultsTableView]){
    cell.textLabel.text = 
    [self.filteredListItems objectAtIndex:indexPath.row];
}
else{
    cell.textLabel.text = [favdata licenseplate];
   // [self.licensePlateArray objectAtIndex:indexPath.row];
}

return cell;}

Основные средства доступа к данным в приложении Delegate.m:

- (NSManagedObjectContext *) managedObjectContext {
if (managedObjectContext != nil) {
    return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
    managedObjectContext = [[NSManagedObjectContext alloc] init];
    [managedObjectContext setPersistentStoreCoordinator: coordinator];
}

return managedObjectContext;}

- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
    return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];

return managedObjectModel;}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
    return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
                                           stringByAppendingPathComponent: @"LoginTest.sqlite"]];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
                              initWithManagedObjectModel:[self managedObjectModel]];
if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                             configuration:nil URL:storeUrl options:nil error:&error]) {
    /*Error for store creation should be handled in here*/
}

return persistentStoreCoordinator;}

- (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];}

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

Может кто-нибудь сказать мне, пожалуйста?

Ответы [ 5 ]

0 голосов
/ 23 января 2012

Обратитесь к этому вопросу о переполнении стека

Базовые данные iPhone: не удалось найти NSManagedObjectModel

Я применил в своем приложении тот же код, который предложил Вивас:

Размещение следующего кода внутри viewDidLoad RootViewController устраняет ошибку:

if (managedObjectContext == nil) { 
    managedObjectContext = [(CoreDataBooksAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    NSLog(@"After managedObjectContext: %@",  managedObjectContext);}

Теперь я не получаю эту ошибку:)

0 голосов
/ 23 января 2012

Две вещи:

  • Убедитесь, что в вашей модели базовых данных есть сущность с именем "Favouritesdata" (очень чувствительная к регистру).
  • На самом деле не имеет отношения к вашему вопросу,но не стоит хранить пароль в NSUserDefaults.Имя пользователя ОК, но не пароль.Это может быть взломано кем-то с необходимыми знаниями, и вы не хотите хранить такие вещи на телефоне, если можете помочь.
0 голосов
/ 23 января 2012

Я думаю, что ваш контекст, вероятно, равен нулю (я могу вызвать ту же ошибку в моем приложении с нулевым контекстом).Это в вашем методе getData:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Favouritesdata" inManagedObjectContext:context];

Можете ли вы пройти код, где вы инициализируете контекст?

0 голосов
/ 23 января 2012

Сообщение об ошибке довольно ясно: нет экземпляра NSManagedObjectModel.

Я использовал Core Data только в одном проекте, и я не знаю, является ли это общепризнанным способом сделать это, ноЯ настраивал различные связанные с Базовыми данными объекты в делегате приложения, а затем передавал контекст управляемого объекта каждому контроллеру, который в этом нуждается.

Но в любом случае Базовые данные сначала немного сложны.Попробуйте прочитать кое-что об этом.

Если это может вам помочь, я так и сделал.

- (NSManagedObjectModel*) managedObjectModel
{
    if(!_managedObjectModel)
    {
        NSString* modelPath = [[NSBundle mainBundle] pathForResource:@"Model" 
                                                              ofType:@"momd"];
        NSURL* modelURL = [NSURL fileURLWithPath:modelPath];
        _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    }

    return _managedObjectModel;
}

- (NSPersistentStoreCoordinator*) persistentStoreCoordinator
{
    if(!_persistentStoreCoordinator)
    {
        NSError* error = nil;
        NSURL* storeURL = [NSURL fileURLWithPath:self.dataStorePath];
        NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:
                                 [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                                 [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

        _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] 
                                       initWithManagedObjectModel:self.managedObjectModel];

        if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                                                      configuration:nil 
                                                                URL:storeURL 
                                                            options:options
                                                              error:&error]) 
        {
            #warning handle core data error
            NSLog(@"Error adding persistent store %@, %@", error, error.userInfo);
            abort();
        }
    }

    return _persistentStoreCoordinator;
}

- (NSManagedObjectContext*) managedObjectContext
{
    if(!_managedObjectContext)
    {
        NSPersistentStoreCoordinator* coordinator = self.persistentStoreCoordinator;

        if(coordinator)
        {
            _managedObjectContext = [[NSManagedObjectContext alloc] init];
            [_managedObjectContext setPersistentStoreCoordinator:coordinator];
        }
    }

    return _managedObjectContext;
}
0 голосов
/ 23 января 2012

Кажется, что CoreData просто не была инициализирована для загрузки вашей модели перед попыткой доступа к этой сущности.Поместите точку останова как в код, который получает сущность, так и в код, который загружает модель CoreData, и посмотрите, какой из них вызывается первым (или если есть какие-либо ошибки при загрузке вашей модели данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...