Используйте имя столбца вместо номера с sqlite3_column_text - PullRequest
5 голосов
/ 15 июня 2011

Есть ли способ использовать имя столбца вместо int для номера столбца в: (char*)sqlite3_column_text(statement, 1)

Это то, что я делаю сейчас:

sqlite3 *db = [MyAppDelegate getNewDBConnection];
sqlite3_stmt *statement = nil;

const char *sql = "select * from foo f join bar b on b.id = f.id;";

if(sqlite3_prepare_v2(db, sql, -1, &statement, NULL) != SQLITE_OK)
   NSAssert1(0,@"Error preparing statement %s", sqlite3_errmsg(db));
       else
       {
           while(sqlite3_step(statement) == SQLITE_ROW) {

               [lorem addObject:[NSString stringWithFormat:@"%s",(char*)sqlite3_column_text(statement, 1)]];

               [ipsum addObject:[NSString stringWithFormat:@"%s",(char*)sqlite3_column_text(statement, 7)]];

           }   

           sqlite3_finalize(statement);

       }

Но в идеале я быдо (char*)sqlite3_column_text(statement, SomeColumn)

Ответы [ 3 ]

4 голосов
/ 15 июня 2011

Во-первых, взгляните на оболочку FMDB для Objective-C, она сэкономит вам много исходного кода SQLite. (Информация FMDB: http://gusmueller.com/blog/archives/2008/06/new_home_for_fmdb.html)

Я не знаю, как передать имя столбца. Однако это упростит вещи и будет более надежным, если вы измените свой SQL и назовете там столбцы, а не «выберите *».

const char *sql = "select f.name, b.address, b.phone ... 

Затем методы доступа просто передают номера столбцов 1, 2, 3, 4, ... Гораздо лучше, чем магические числа 1 и 7!

name    = sqlite3_column_text(statement, 1)
address = sqlite3_column_text(statement, 2)
phone   = sqlite3_column_text(statement, 3)
...
3 голосов
/ 24 сентября 2014

Кажется, что нет прямого способа сделать это. То, что я сделал, было а) получить количество полей в результате с помощью sqlite3_column_count ()

б) Затем я создал словарь для сопоставления значений

в) Затем я перебрал бы столбцы и заполнил словарь парами ключ / значение, используя column_name / индекс

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

Вот мой фрагмент кода. Надеюсь, это поможет !!!

        int columnCount = sqlite3_column_count(statement);

        NSMutableDictionary *mapper=[[NSMutableDictionary alloc] init];
        for(int i=0;i<columnCount;i++){
            const char *_columnName=sqlite3_column_name(statement, i);
            NSString *columnName=[[NSString alloc] initWithUTF8String:_columnName];
            [mapper setObject:[NSNumber numberWithInteger:i] forKey:columnName];
        }
2 голосов
/ 03 июля 2011

вы могли бы даже пойти настолько далеко, чтобы создать структуру для сопоставления имен ваших полей sql с номерами столбцов, тогда вы могли бы получить доступ к своим полям следующим образом; name = sqlite3_column_text (оператор, tablename_struct.name) - сейчас я работаю над чем-то вроде этого.

    struct ElementsStructure {
        int ID; 
        int Slug; 
        int Title; 
        int Value; 
        int Type; 
        int Flags; 
        int Index;
        int Options; 
    };
    //field to column mappings for sql lite queries
    struct ElementsStructure oElements;
    oElements.ID = 0;
    oElements.Slug = 1; 
    oElements.Title = 2; 
    oElements.Value = 3; 
    oElements.Type = 4; 
    oElements.Flags = 5; 
    oElements.Index = 6;
    oElements.Options = 7; 

...

    NSNumber *ID = [NSNumber numberWithInt: sqlite3_column_int(statement, oElements.ID)];

Мне просто нравится этот метод, поскольку, если структура названа как фактическое имя таблицы, она обеспечивает супер простой способ визуально сопоставить то, что вы назначаете ... особенно для тех, кто просматривает ваш код.

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