有没有办法在列号中使用列名而不是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)
答案 0 :(得分:4)
首先,看看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 ...
然后,访问者只需传递列号1,2,3,4 ......比魔术数字1&更好。 7!
name = sqlite3_column_text(statement, 1)
address = sqlite3_column_text(statement, 2)
phone = sqlite3_column_text(statement, 3)
...
答案 1 :(得分:3)
似乎没有直接的做法。我做的是 a)通过sqlite3_column_count()
获取结果中的字段数b)然后我创建了一个字典来映射值
c)然后我会遍历列并使用键/值对填充字典 列名/索引
现在,您有一个映射字典,其中包含列名的索引。您可以使用它来使用列名来获取列的索引。
这是我的代码段。希望它有所帮助!!!
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 :(得分:2)
你甚至可以创建一个结构来将你的sql字段名称映射到列号,然后就可以访问你的字段了; name = sqlite3_column_text(statement,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)];
我喜欢这种方法,因为如果结构被命名为实际的表名,它提供了一种超级简单的方法来直观地关联你所分配的内容......特别是对于那些可能正在查看代码的人。