2017-11-06 20 views
2

iOS 11では、サブセレクションステートメントを使用してsqlite3_column_nameをSQLに使用すると、カラム名がテーブル接頭辞で返されます。subselectステートメントを使用したSQLのSQLiteカラム名がカラム名の前にテーブル名

など。このSQLを考えてみます。

SELECT f.foo_value, b.bar_value 
    FROM foo as f LEFT JOIN 
    (SELECT * FROM bar) AS b ON f.foo_id = b.foo_id 

あなたがsqlite3_column_nameでカラム名を取得した場合(これはObjective-Cの抜粋であるが、これはObjective-Cのか、スウィフトに固有のSQLiteの問題ではないことに注意):

const char *name1 = sqlite3_column_name(statement, 0); 
const char *name2 = sqlite3_column_name(statement, 1); 

NSLog(@"SQLite version: %s", sqlite3_version); 
NSLog(@"name of column 0: %s", name1); 
NSLog(@"name of column 1: %s", name2); 
iOSの11.1で

は、このレポート:

SQLiteバージョン:3.19.3列0の
名前:
f.foo_valueを1列目の3210名:

は、iOS 10.1で、これは報告b.bar_value:

SQLiteバージョン:3.14.0列0の
名前:foo_value列1の
名前:bar_valueを

なぜですか?

ところで、この問題は、SQLに副選択文が含まれている場合にのみ現れます。

答えて

1

SQLiteのdocumentation for sqlite3_column_nameが言うように:

AS句がある場合、結果列の名前は、その列の「AS」句の値です。 AS句がない場合、列の名前は指定されておらず、SQLiteのあるリリースから次のリリースに変更される可能性があります。

あなたは情報提供の目的以外の目的でsqlite3_column_nameの結果を使用したいのであれば、あなたは本当に、例えば、あなたのSQLにAS句を使用する必要があります

この変更は、SQLiteの3.19.0で導入されました:

SELECT f.foo_value AS foo_value, b.bar_value AS bar_value 
    FROM ... 

Gwendal Roué notedように、これはiOSの11に含まれているのSQLiteのバージョンで導入された既知の問題です。これは、iOS 11に同梱されているSQLite 3.19.3に存在します.SQLite 3.20.0では元に戻しました。

詳細については、以下を参照してください。

関連する問題