Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Identifying datatype of a column in an SQLite Android Cursor

Tags:

android

sqlite

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.

like image 325
Arun Avatar asked Jun 09 '11 12:06

Arun


People also ask

How do I find data in SQLite?

To use full-text search in SQLite, you use FTS5 virtual table module. Notice that you cannot add types, constraints, or PRIMARY KEY declaration in the CREATE VIRTUAL TABLE statement for creating an FTS5 table. If you do so, SQLite will issue an error.

What is cursor in SQLite Android?

A Cursor represents the result of a query and basically points to one row of the query result. This way Android can buffer the query results efficiently; as it does not have to load all data into memory.


2 Answers

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 <= 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;
}
like image 179
Robson Avatar answered Oct 12 '22 01:10

Robson


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.

like image 29
Nik Avatar answered Oct 12 '22 00:10

Nik