Использование Sqlite в разработке для iphone: если я открою базу данных в функции init, она недоступна для других моих функций. Есть идеи? - PullRequest
0 голосов
/ 06 июля 2010

Я пытаюсь использовать sqlite в классе 'data services', как показано ниже. Я продолжаю получать код ошибки 1 при вызове sqlite3_prepare_v2. Журналы, безусловно, подтверждают, что база данных открывается перед вызовом моей функции recipeNames. Я так в тупик! Это вещь управления памятью с sqlite3 * db? Например, это освобождается, когда я этого не хочу?

Я уверен, что с кодом все в порядке, потому что, если я добавлю sqlite_open в функцию recipeNames, он отлично работает. Это просто, если я пытаюсь открыть его в методе инициализации, это не удается. Большое спасибо, ребята.

Мой заголовок:

#import <Foundation/Foundation.h>
#include <sqlite3.h>


@interface DataServices : NSObject {
    sqlite3 *db;
    int dbrc;
}

- (NSMutableArray *) recipeNames;

@end

Файл реализации:

#import "DataServices.h"
#import "MenuMakerAppDelegate.h"
#include <sqlite3.h>

@implementation DataServices

- (id)init {
    [super init];

    // my init stuff here

    // Get the database name
    const char *dbPathUtf8 = [((MenuMakerAppDelegate*)[UIApplication sharedApplication].delegate).dbFilePath UTF8String];
    // Open the database
    NSLog(@"opening db");
    sqlite3_open (dbPathUtf8, &db);
    NSLog(@"opened db");

    return self;
}

- (void)dealloc {
    // My dealloc stuff here
    NSLog(@"Closing DB");
    sqlite3_close(db);
    [super dealloc];
}

- (NSMutableArray *) recipeNames {
    // Create the empty array to return
    NSMutableArray *arr = [[[NSMutableArray alloc] init] autorelease];
    // The SQL
    NSString *sql = @"select recipe from recipes";
    const char *sqlUtf8 = [sql UTF8String];
    // Make the prepared statement (like C# SqlCommand)
    sqlite3_stmt *dbps;
    dbrc=sqlite3_prepare_v2(db, sqlUtf8, -1, &dbps, NULL); // FAILS HERE !!!
    if (dbrc) NSLog(@"Prepare!!! %d", dbrc);
    // Loop thru rows
    while (sqlite3_step(dbps) == SQLITE_ROW) {
        NSString *recipe = [NSString stringWithUTF8String:(char*)sqlite3_column_text(dbps,0)];
        [arr addObject:recipe];
    }
    // Get rid of the command
    sqlite3_finalize(dbps);
    // Return the array that was autoreleased before
    return arr;
}

@end

1 Ответ

2 голосов
/ 06 июля 2010

Подсказка:

NSLog(@"opening db %s", dbPathUtf8);
int result = sqlite3_open(dbPathUtf8, &db);
NSLog(@"sqlite3_open returned %d", result);

Держу пари, что dbPathUtf8 имеет значение null и sqlite3_open возвращает ошибку.1 равен SQLITE_ERROR (ошибка SQL или отсутствует база данных) , что, вероятно, означает, что db равно NULL.

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