CallLog コンテンツ プロバイダーにクエリを実行していて、列の種類を検出する必要があります。
Cursor.getType(int columnIndex)
Honeycomb 以降 (API レベル 11+) では、次の型のいずれかを返すメソッドを呼び出すことで、列の優先データ型を取得できます。
- FIELD_TYPE_NULL (0)
- FIELD_TYPE_INTEGER (1)
- FIELD_TYPE_FLOAT (2)
- FIELD_TYPE_STRING (3)
- FIELD_TYPE_BLOB (4)
Honeycomb <11 デバイスでこれを達成するにはどうすればよいですか?
私は次のことを試しました:
for ( int i = 0; i < cursor.getColumnCount(); i++ ) {
int columnType = -1;
try {
cursor.getInt( i );
columnType = Cursor.FIELD_TYPE_INTEGER;
} catch ( Exception ignore ) {
try {
cursor.getString( i );
columnType = Cursor.FIELD_TYPE_STRING;
} catch ( Exception ignore1 ) {
try {
cursor.getFloat( i );
columnType = Cursor.FIELD_TYPE_FLOAT;
} catch ( Exception ignore2 ) {
try {
cursor.getBlob( i );
columnType = Cursor.FIELD_TYPE_BLOB;
} catch ( Exception ignore3 ) {
columnType = Cursor.FIELD_TYPE_NULL;
}
}
}
}
}
ただし、例外はスローされません。データは常に、チェック対象の最初の型 (この場合は getInt()) にキャストされます。つまり、列の型がIntegerの場合は正しい値が得られますが、他のすべての型の場合は0になります。
どのタイプが格納されているかを確認するためにドキュメントを調べないのはなぜですか? 列はデバイスの製造元によって異なり、すべてが文書化されているわけではありません。次の質問を参照してください: ContentProviders の製造元依存の違いを処理する方法は?
何か案は?