有没有办法在Android中识别游标中列的数据类型。游标对象有许多方法来获取列名,列值。
我想找出该列的SQLite数据类型(TEXT,INTEGER)等...
我正在编写一个通用函数来解析游标并执行操作。我只会得到一个sql字符串作为函数的参数。
答案 0 :(得分:8)
根据SQLite文档(http://www.sqlite.org/datatype3.html),SQLite中的列没有数据类型 - 这些列中的值有。
SQLite版本3数据库中的任何列(INTEGER PRIMARY KEY列除外)都可用于存储任何存储类的值。
如果您使用的是API级别11或更高级别,则光标支持getType()
(请参阅http://developer.android.com/reference/android/database/AbstractWindowedCursor.html#getType(int))。
如果您使用的是较早的API级别,并且您知道给定游标中的所有结果都来自同一个表,那么您可以执行类似(未经测试)的操作:
// Assumes "cursor" is a variable that contains the cursor you're
// interested in.
String tableName = "..."; // The name of the table
SQLiteDatabase db = cursor.getDatabase();
String[] names = cursor.getColumnNames();
for (name : names) {
Cursor typeCursor =
db.rawQuery("select typeof (" + name + ") from " + tableName;
typeCursor.moveToFirst();
Log.v("test", "Type of " + name + " is " + typeCursor.getString(0);
}
但如果传入的游标(例如)是连接两个或多个表的db.rawQuery()调用的结果,那么(我期望)会失败。
答案 1 :(得分:5)
答案还是NiK,没问题。但是如果你的db是空的,他的代码会崩溃。 我建议使用:
String Query = "PRAGMA table_info(my_table_name)";
Cursor my_cursor = db.rawQuery(Query, null);
my_cursor.moveToFirst();
Column_name = my_cursor.getString(my_cursor.getColumnIndex("name"));
Column_type = my_cursor.getString(my_cursor.getColumnIndex("type"));
答案 2 :(得分:2)
我还没有测试但是,尝试使用cursor.getType(i)
像这样:
public static List resultSetToArrayListAndroid(Cursor cursor) throws SQLException {
int columns = cursor.getColumnCount();
ArrayList list = new ArrayList();
while (cursor.moveToNext()) {
HashMap row = new HashMap(columns);
for (int i = 1; i <= columns; ++i) {
switch (cursor.getType(i)) {
case Cursor.FIELD_TYPE_FLOAT:
row.put(cursor.getColumnName(i), cursor.getFloat(i));
break;
case Cursor.FIELD_TYPE_INTEGER:
row.put(cursor.getColumnName(i), cursor.getInt(i));
break;
case Cursor.FIELD_TYPE_STRING:
row.put(cursor.getColumnName(i), cursor.getString(i));
break;
}
}
list.add(row);
}
return list;
}
答案 3 :(得分:1)
您应该使用sqlite数据库中的meta data:
http://developer.android.com/reference/java/sql/ResultSetMetaData.html
通过在ResultSet()上使用getMetaData()来获取此项目。
所以,这不是你将使用的在android中使用sqlite数据库的常用方法,而是通常的JDBC方式:
此致 斯特凡