Indentifying datatype of a column in an SQLite Android Cursor

匿名 (未验证) 提交于 2019-12-03 01:30:01

问题:

Is there any way to identify the datatype of a column in a cursor in Android. The cursor object has a number of methods to get the columnname, column value.

I want to find out the SQLite datatype of the column (TEXT, INTEGER) etc...

I'm writing a generic function to parse a cursor and perform operations. I will only get a sql string as an argument to the function.

回答1:

Per the SQLite documentation (http://www.sqlite.org/datatype3.html) columns in SQLite don't have a datatype -- the values in those columns do.

Any column in an SQLite version 3 database, except an INTEGER PRIMARY KEY column, may be used to store a value of any storage class.

If you're using API level 11 or above then the cursor supports getType() (see http://developer.android.com/reference/android/database/AbstractWindowedCursor.html#getType(int)).

If you're using an earlier API level, and you know that all the results in a given cursor come from the same table then you could do something like (untested):

// 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); } 

But that will (I expect) fail if the passed in cursor was (for instance) the result of a db.rawQuery() call that joined two or more tables.



回答2:

The answer or NiK, are fine. But if your db is empty, this crash. I suggest use

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")); 


回答3:

You should use meta data from sqlite Database :

http://developer.android.com/reference/java/sql/ResultSetMetaData.html

You get this item by using getMetaData() on a ResultSet().

So, it's not the usual way of using a sqlite database in android that you shall use, but the usual JDBC way :

  1. get a connection (through driver manager getConnection)
  2. get a statement (through connection.createStatement)
  3. get a resultset (through statement.executeQuery)
  4. get the meta data (through resultset.getMetaData)

Regards, Stéphane



回答4:

I didn't tested yet but, try to use cursor.getType(i)

Like this:

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 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!