Вставка в базу данных sqlite3 - PullRequest
0 голосов
/ 03 ноября 2011

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

Пользователь получает возможность выбрать символ, также имя пользователя, это передается через метод в мой объект dbhandler, как показано на рисунке.

 -(BOOL) registerUser : (NSString *) username : (int) character {

sqlite3 *db;

if(sqlite3_open([dbpath UTF8String], &db) == SQLITE_OK)
{  
    NSString *formatetStmt = [NSString stringWithFormat:@"INSERT INTO user VALUES (null, '%@', %d, 0, 1, 5, 1, 1, 1, 1, 1 ,1)", username, character];
    sqlite3_stmt *comstmt;

    if(sqlite3_prepare_v2(db, [formatetStmt UTF8String], -1, &comstmt, NULL) == SQLITE_OK)
    {                       
        sqlite3_finalize(comstmt);

        if(sqlite3_step(comstmt) == SQLITE_DONE) {
            NSLog(@"SUCCESS");
            sqlite3_finalize(comstmt);
            return YES;
        }
        else { 
            NSLog(@"NO SUCCES");
            return NO;
        }
        sqlite3_reset(comstmt);    
    }
}

NSAssert1(0, @"addMyObjectIntoDatabase: failed to prepare statement with err '%s'", sqlite3_errmsg(db));

NSLog(@"FAIL");
sqlite3_close(db);
return NO;

}

}

Когда код, который я выполнил, говорит: НЕТ УСПЕХА, однако я не получаю сообщение об ошибке, и в базу данных ничего не добавляется.

Ами, здесь что-то не так?

1 Ответ

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

SQLite - это библиотека C, с которой не очень желательно работать напрямую, и я рекомендую использовать для этого оболочку Objective-C, например FMDB или даже Core Data .

Вот некоторые проблемы с вашим примером.

  1. Вы никогда не закроете базу данных, если не удается открыть базу данных или подготовить оператор

  2. Вы должны связать имя пользователя и символ, используя ?, чтобы предотвратить внедрение SQL, а не отформатированную строку.

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

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

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


-(BOOL) registerUser : (NSString *) username : (int) character {
    //If using the same database for more operations often you may want to just keep
    //the db open in a centralized location while the app is running
    sqlite3 *db;

    if(sqlite3_open([dbpath UTF8String], &db) == SQLITE_OK)
    {  
        //You should bind these values to prevent SQL Injection
        NSString *formatetStmt = [NSString stringWithFormat:@"INSERT INTO user VALUES (null, '%@', %d, 0, 1, 5, 1, 1, 1, 1, 1 ,1)", username, character];
        sqlite3_stmt *comstmt;

        if(sqlite3_prepare_v2(db, [formatetStmt UTF8String], -1, &comstmt, NULL) == SQLITE_OK)
        {                       
            // You are finalizing a statement before using it move this
            // to after your done with the statement
            sqlite3_finalize(comstmt);
            //Try int status = sqlite3_step(comstmt)
            if(sqlite3_step(comstmt) == SQLITE_DONE) {
                NSLog(@"SUCCESS");
                sqlite3_finalize(comstmt);
                return YES;
            }
            else { 
                NSLog(@"NO SUCCES");
                return NO;
            }
            sqlite3_reset(comstmt); //<- Never gets called because of return
                                    // statement but you should finalize here
        }
    }

    NSAssert1(0, @"addMyObjectIntoDatabase: failed to prepare statement with err '%s'", sqlite3_errmsg(db));

    NSLog(@"FAIL");
    sqlite3_close(db); // <-Never gets called unless statement fails to prepare
    return NO;

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