Базовые данные: проблема при извлечении данных из базы данных sqlite - PullRequest
0 голосов
/ 20 января 2011

Я пытаюсь отобразить некоторые данные в табличном представлении, которое является частью контроллера представления в контроллере вкладок. В настоящее время я пытаюсь запустить приложение на iPhone Simulator. Я скопировал базу данных sqlite в следующую папку - / Пользователи / {имя пользователя} / Библиотека / Поддержка приложений / iPhoneSimulator / 4.2 / Приложения / {appid} / Документы

Теперь я пытаюсь получить данные методом 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]);
            }
        }
    }
}

Не могу понять, почему это не работает ????

Ответы [ 5 ]

1 голос
/ 02 августа 2011

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

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

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

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

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

Когда я работал с БД, я также обнаружил, что каждый раз помогает использовать Build -> Clean All Targets, а также iPhoneSimulator -> Reset Contents and Settings ...

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

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

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

  1. Запустите проект в Xcode
  2. Нажмите кнопку «Домой» на iPhone Simulator
  3. Удалить iBountyHunter
  4. Выйти из симулятора
  5. Запустить проект снова
0 голосов
/ 20 января 2011

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

0 голосов
/ 20 января 2011

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

...