Трудность в получении определенных данных из базы данных - PullRequest
0 голосов
/ 13 марта 2012

У меня есть таблица с двумя столбцами как комбинация (текст), флаг (число). Я пытаюсь получить значение флага в зависимости от значения комбинации, используя предложение where в запросе выбора.

Проблема в том, что когда значение комбинации начинается с 1, например где комбинация = '1001', тогда она извлекает правильное значение флага из таблицы, но когда оно начинается с 0, например, где комбинация = '0010', то из базы данных ничего не получается. Я отладил код, но не получил причину для этого. Ниже приведено изображение базы данных.

This is table having two columns.

  -(void)fetchfromDatabase
{
      sqlite3 *database;

NSString *strPath = [[NSBundle mainBundle]pathForResource:@"ken" ofType:@"db"];
NSLog(@"DBPath : %@",strPath);

const char *dbPath = [strPath UTF8String];

if(sqlite3_open(dbPath, &database)==SQLITE_OK)
{
    NSLog(@"Database is Ok");

   // const char *cConcate = [concate UTF8String];
    NSString *query = [NSString stringWithFormat:@"select * from kentable where combination =%@",concate];
    NSLog(@"final concate in database:%@",concate);
    NSLog(@"Query:%@",query);
    const char *sqlQuery =[query cStringUsingEncoding:NSASCIIStringEncoding];
    NSLog(@"char query %s", sqlQuery);
    sqlite3_stmt *queryStatement;

    if(sqlite3_prepare_v2(database, sqlQuery,-1,&queryStatement, NULL)==SQLITE_OK)
    {
        NSLog(@"Conversion is Ok");


        while (sqlite3_step(queryStatement)==SQLITE_ROW) 
        {
            NSLog(@"in While Statement of row");
            int flag=sqlite3_column_int(queryStatement, 1);

            NSLog(@"question 5:%d",flag);
        }
        sqlite3_reset(queryStatement);
    }
    else 
    {
        NSLog(@"ERROR");
    }

    sqlite3_close(database);

}

}

Ответы [ 2 ]

3 голосов
/ 13 марта 2012

Попробуйте изменить код следующим образом.Не против, но подготовка SQL-запроса, как вы сделали, это плохая практика, лучше следуйте стандартной практике.Вы можете связать строку, используя функцию sqlite3_bind_text.

if(sqlite3_open(dbPath, &database)==SQLITE_OK)
{
    const char *sqlQuery = "select * from kentable where combination = ?";
    sqlite3_stmt *queryStatement;

    if(sqlite3_prepare_v2(database, sqlQuery,-1,&queryStatement, NULL)==SQLITE_OK)
    {
        NSLog(@"Conversion is Ok");
        sqlite3_bind_text(insertStmt,1, [concate UTF8String], -1, SQLITE_TRANSIENT);    

        while (sqlite3_step(queryStatement)==SQLITE_ROW) 
        {
            NSLog(@"in While Statement of row");
            int flag=sqlite3_column_int(queryStatement, 1);

            NSLog(@"question 5:%d",flag);
        }
        sqlite3_reset(queryStatement);
    }
    else 
    {
        NSLog(@"ERROR");
    }
    sqlite3_close(database);
}
1 голос
/ 13 марта 2012

У меня тоже такие задачи ... это хорошо работает ... Просто измени свой код на

NSString * data = [собственное состояние: комбинация];

    -(NSString *) status:(NSString *)concate
    {
    databasePath = [[NSString alloc] initWithString: [[NSBundle mainBundle] pathForResource:@"ken" ofType:@"db"]];
        sqlite3_stmt    *statement;
        NSString *aName;
        const char *dbpath = [databasePath UTF8String];

        if (sqlite3_open(dbpath, &database) == SQLITE_OK)
        {
            NSString *querySQL = [NSString stringWithFormat: 
                                  @"SELECT combination, flag FROM details WHERE combination =\"%@\"", 
                                  concate];

            const char *query_stmt = [querySQL UTF8String];
            sqlite3_prepare_v2(database, 
                               query_stmt, -1, &statement, NULL);
            if (sqlite3_step(statement) == SQLITE_ROW)
            {
                // Read the data from the result row
                aName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];

                NSLog(@"same %@" ,aName) ;

            }
            else
            {
                aName=nil;
            }

    sqlite3_finalize(statement);
            sqlite3_close(database);

        }


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