Моя база данных ios sqlite3 не создается - PullRequest
0 голосов
/ 16 ноября 2011

Я пытаюсь создать класс для абстрагирования моих методов SQLite от моей бизнес-логики и т. Д. Однако я не могу получить доступ к моей базе данных, потому что она выглядит так, как будто она никогда не создается.Пожалуйста, смотрите код ниже.Я открываю базу данных по указанному пути.Затем я закрываю это позже.После закрытия я использую терминал для проверки моего каталога документов (в приложении).На данный момент нет файла, где я его указал.Создает ли он файл только при вставке данных в базу данных?Или я не правильно создаю базу данных?

#import "SQLController.h"

@implementation SQLController
@synthesize database;

-(id)initWithDefaultDB {    
    return [self initWithDBPath:[self dbFilePath]];
}

-(id)initWithDBPath:(NSString *)dbPath {
    self = [super init];
    if(self) {
        sqlite3 *db;    
        const char *dbPathCString = [dbPath UTF8String];
        int result = sqlite3_open(dbPath, &db);
        if (result != SQLITE_OK) {
            NSString *errorTag = @"Failed to open database at ";
            NSString *errorMessage = [errorTag stringByAppendingString:dbPath];
            NSLog(errorMessage);
            sqlite3_close(db);
        } else {
            const char *createQuery = "CREATE TABLE IF NOT EXISTS items (title TEXT, details TEXT, category TEXT);";
            self.database = db;
            char *error;
            if (sqlite3_exec(self.database, createQuery, NULL, NULL, &error) != SQLITE_OK) {
                sqlite3_close(self.database);
                NSLog(@"Failed to create table");
                NSAssert(0,@"Error creating table: %s", error);
            }
        }
    }
    return self;
}

-(NSString *)dbFilePath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:@"testdb.sqlite"];
}


@end

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Вы когда-нибудь писали в БД перед ее закрытием?Sqlite ленив - он не создает БД до первой записи.

Еще одна вещь, на которую стоит обратить внимание, - это создание строки C (dbPathCString), но не передача ее в open (вы передаете dbPath).

-(id)initWithDBPath:(NSString *)dbPath {
self = [super init];
if(self) {
    sqlite3 *db;    
    const char *dbPathCString = [dbPath UTF8String];
    int result = sqlite3_open(dbPath, &db);
1 голос
/ 16 ноября 2011

Вместо того, чтобы заново изобретать колесо (как бы это ни было весело, поверьте мне, я знаю!), Вас может заинтересовать использование FMBD .Это оболочка Objective-c для доступа к SQLITE.

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