sqllite3 подготовить запрос вставки в программировании iphone - PullRequest
0 голосов
/ 20 мая 2009
(BOOL) addticket {
    NSString *event=@"max";
    NSString *venue=@"tvm";
    sqlite3 *database;
    databaseName = @"smbhDB.sql";
    sqlite3_stmt *addStatement ;
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
    if(addStatement == nil) {   
        const char *sql ="insert into tickets (venue, event,) Values (?,?)";

        if(sqlite3_prepare_v2(database, sql, -1, &addStatement, NULL) != SQLITE_OK)
            NSAssert1(0, @"444 Error while creating add  statement. '%s'", sqlite3_errmsg(database));
    }

    sqlite3_bind_text(addStatement, 1, [venue UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(addStatement, 2, [event UTF8String], -1, SQLITE_TRANSIENT);

    if(SQLITE_DONE != sqlite3_step(addStatement))
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));

    sqlite3_reset(addStatement);
...

Этот код не работает. Пожалуйста, может кто-нибудь помочь мне исправить это. Если кто-то может опубликовать образец кода, пожалуйста, загрузите.

Ответы [ 3 ]

3 голосов
/ 20 мая 2009

продублируйте? Почему я не могу выполнить этот код?

ВЫ ДОЛЖНЫ ОТКРЫТЬ БАЗУ ДАННЫХ до выполнения инструкции

1 голос
/ 20 мая 2009

Рассмотрим FMDB или данные ядра Omni, такие как библиотека. Все детали скрыты за красивым простым абстрактным интерфейсом.

http://gusmueller.com/blog/archives/2008/03/fmdb_for_iphone.html

или

http://www.omnigroup.com/developer (OmniDataObjects)

Удачи.

1 голос
/ 20 мая 2009

Я не уверен на 100%, потому что нет подробностей об ошибках, но похоже, что addStatement не инициализируется. Objective-C инициализирует все указатели к 0, когда они размещены в стеке? Я знаю, что в Linux это не будет работать.

Возможно, попробуйте это: sqlite3_stmt *addStatement = nil;

Мне интересно, почему вы даже проверяете addStatement == nil? Нет причин проверять это, поскольку вы должны инициализировать его в каждом случае.

Короче, переписать так:

(BOOL) addticket {
    NSString *event=@"max";
    NSString *venue=@"tvm";
    sqlite3 *database;
    databaseName = @"smbhDB.sql";
    sqlite3_stmt *addStatement ;
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    const char *sql ="insert into tickets (venue, event,) Values (?,?)";

    databasePath = [documentsDir stringByAppendingPathComponent:databaseName];

    /* this is no longer conditional code */
    if(sqlite3_prepare_v2(database, sql, -1, &addStatement, NULL) != SQLITE_OK)
        NSAssert1(0, @"444 Error while creating add  statement. '%s'", sqlite3_errmsg(database));

    sqlite3_bind_text(addStatement, 1, [venue UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(addStatement, 2, [event UTF8String], -1, SQLITE_TRANSIENT);

    if(SQLITE_DONE != sqlite3_step(addStatement))
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));

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