使用sqlite3_column_text使用列名而不是数字

Tho*_*s K 5 sqlite iphone objective-c ios

有没有办法在列号中使用列名而不是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);

       }
Run Code Online (Sandbox Code Playgroud)

但理想情况下我会这样做 (char*)sqlite3_column_text(statement, SomeColumn)

Gra*_*rks 5

首先,看看 Objective-C 的 FMDB 包装器,它会为您节省大量原始 SQLite 编码。(FMDB 信息:http ://gusmueller.com/blog/archives/2008/06/new_home_for_fmdb.html )

我不知道传递列名的方法。但是,如果您更改 SQL 并在那里命名列,而不是“select *”,它会简化事情,并且更加健壮。

const char *sql = "select f.name, b.address, b.phone ... 
Run Code Online (Sandbox Code Playgroud)

然后访问器简单地传递列号 1, 2, 3, 4, ... 比幻数 1 和 7 好得多!

name    = sqlite3_column_text(statement, 1)
address = sqlite3_column_text(statement, 2)
phone   = sqlite3_column_text(statement, 3)
...
Run Code Online (Sandbox Code Playgroud)


Ruc*_*ana 5

似乎没有直接的方法可以做到这一点。我所做的是 a) 通过 sqlite3_column_count() 获取结果中的字段数

b) 然后我创建了一个字典来映射值

c) 然后我将遍历列并使用 column_name/index 用键/值对填充字典

现在,您有一个包含列名索引的映射字典。您可以使用它通过使用列名来获取列的索引。

这是我的代码片段。希望能帮助到你 !!!

        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];
        }
Run Code Online (Sandbox Code Playgroud)