识别SQLite Android游标中列的数据类型

时间:2011-06-09 12:53:59

标签: android sqlite

有没有办法在Android中识别游标中列的数据类型。游标对象有许多方法来获取列名,列值。

我想找出该列的SQLite数据类型(TEXT,INTEGER)等...

我正在编写一个通用函数来解析游标并执行操作。我只会得到一个sql字符串作为函数的参数。

4 个答案:

答案 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方式:

  1. 获取连接(通过驱动程序管理器getConnection)
  2. 获取声明(通过connection.createStatement)
  3. 获取结果集(通过statement.executeQuery)
  4. 获取元数据(通过resultset.getMetaData)
  5. 此致 斯特凡