我正在查询 CallLog 内容提供程序并需要检测列类型。
在 Honeycomb 和更新版本(API 级别 11+)中,您可以通过调用Cursor.getType(int columnIndex)
返回以下类型之一的方法来获取列首选数据类型:
- 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 中与制造商相关的差异?
有任何想法吗?