2011-01-20 4 views
0

Я пытаюсь получить некоторые данные, отображаемые в виде таблицы, которая является частью контроллера представления в контроллере панели. В настоящее время я запускаю приложение на iPhone Simulator. Я скопировал SQLite базу данных по следующему адресу - /Users/{имя пользователя}/Library Поддержка/Application/iPhoneSimulator/4,2/Применения/{APPID}/ДокументыОсновные данные: проблема с извлечением данных из базы данных sqlite

Теперь я пытаюсь извлечь данные в viewWillAppear методе мой контроллер просмотра.

#import "FugitivesViewController.h"  
#import "MyAppDelegate.h" 

#import "Fugitive.h" 

- (void)viewWillAppear:(BOOL)animated { 
     [super viewWillAppear:animated]; 
     NSManagedObjectContext *context = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
     NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
     NSEntityDescription *entity = [NSEntityDescription entityForName:@"Fugitive" inManagedObjectContext:context]; 
     [request setEntity:entity]; 

     NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
     NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
     [request setSortDescriptors:sortDescriptors]; 
     [sortDescriptors release]; 
     [sortDescriptor release]; 

     NSError *error = nil; 
     NSMutableArray *mutableFetchResults = [[context executeFetchRequest:request error:&error] mutableCopy]; 

     if (mutableFetchResults == nil) { 
      NSLog(@"Error while fetching the results"); 
     } 

     self.items = mutableFetchResults; 

     [mutableFetchResults release]; 
     [error release]; 

     [request release]; 
     [context release]; 
    } 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    // Return the number of rows in the section. 
    return [self.items count]; 
} 

- (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]; 
    } 
    Fugitive *fugitive = [items objectAtIndex:indexPath.row]; 
    cell.textLabel.text = fugitive.name; 

    return cell; 
} 

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

Проверка в отладчике измененного массива показывает 0 объектов. Я только начал разработку iOS. Может ли кто-нибудь помочь мне разобраться, что здесь может быть неправильным?

ОБНОВЛЕНИЕ - с помощью комментария Yuji я проверил файл, который копируется в папке «Документы» iPhone Simulator. У него нет никаких данных. Вот почему в представлении нет данных. Таким образом, проблема заключается в том, что код используется для копирования файла из папки проекта в папку документов приложения.

Вот как это происходит ....

// MyAppDelegate.m 
#import "MyAppDelegate.h" 

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

    // Override point for customization after application launch. 
    [self createEditableCopyOfDatabaseIfNeeded]; 

    [self.window addSubview:tabcontroller.view]; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

- (void)createEditableCopyOfDatabaseIfNeeded { 
    NSString *defaultDirectory = [[self applicationDocumentsDirectory] absoluteString]; 
    NSString *writableDBPath = [defaultDirectory stringByAppendingPathComponent:@"iBountyHunder1.sqlite"]; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    if (![fileManager fileExistsAtPath:writableDBPath]) { 
     NSString *defaultDBPath = [[NSBundle mainBundle] pathForResource:@"iBountyHunder" ofType:@"sqlite"]; 
     if (defaultDBPath) { 
      NSError *error; 
      BOOL success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 
      if (!success) { 
       NSLog(@"The error is %@", [error localizedDescription]); 
      } 
     } 
    } 
} 

не удается получить, почему это не работает ????

+0

Как вы создали базу данных sqlite? – Yuji

+0

@Yuji - Я следую руководству Head First iPhone Development - скопировал базу данных sqlite здесь http://www.headfirstlabs.com/iphonedev - Глава 7 – vikmalhotra

+0

Освобождение контекста управляемого приложения в viewWillAppear неверно. Указатель для объекта был восстановлен, но владение не было принято. – Evan

ответ

0

Я загрузил образец кода для главы 7. Я открыл его в XCode и обновил Project-> Edit Project Settings-> Base SDK до последнего sdk (4.2). Если бы план заключался в создании нового проекта с нуля, убедитесь, что он поддерживается Core Data и что код из их проекта скопирован и вставлен правильно.

0

Ваш класс начинается с #import "MyAppDelegate.h", что заставляет меня подозревать, что это ваш делегат приложения, а не контроллер вида. Если это не контроллер представления, я не думаю, что - (void)viewWillAppear:(BOOL)animated будет запущен. Попробуйте поместить NSLog(@"this code is being run"); в этот метод, чтобы убедиться, что он выполняется.

+0

Пропущено, чтобы скопировать строку здесь. Я отредактировал импорт класса для контроллера вида. Код выше - только контроллер просмотра. Я импортирую 'MyAppDelegate.h' для получения ссылки на' managedObjectContext'. – vikmalhotra

1

Вы скопировали файл sqlite3 в папку «Документы» самостоятельно? Код создает копию для записи в базу данных, если она не может найти ее.

Выполните следующие действия.

  1. Запуск проекта в Xcode
  2. Нажмите кнопку домой на iPhone Simulator
  3. Удалить iBountyHunter
  4. Бросить Simulator
  5. Выполнить проект снова
1

Я только заметил, что вы назвали свой db «iBountyHunder», а также «iBountyHunder1» в одном из фрагментов кода выше. Файл, предоставленный Head First, - «iBountyHunter» (t, а не d в конце).

Возможно, вам захочется проверить, совпадает ли имя вашего проекта с вашим именем файла db, потому что основной шаблон данных ожидает их идентичности.

Когда я получал дб работу, я также нашел, что это помогло каждый раз использовать Build -> Очистить все цели, а также iPhoneSimulator -> Сброс содержимого и настроек ...

1

Я получил ту же ошибку, когда пытаясь следовать коду из книги. Проверяя доступную базу данных на пути записи и проверяя содержимое обоих файлов .sqlite, Я обнаружил, что имя базы данных должно совпадать с именем проекта. Глядя на ваш импорт, похоже, вы называете свой проект My. Поэтому в качестве имени файла должна быть скопирована база данных My.sqlite. Я пробовал это на своем macbook, и он работает.

FYI, я использую sqlite database browser для проверки содержимого файлов .sqlite.

Смежные вопросы