2011-06-09 15 views
8

¿Hay alguna manera de identificar el tipo de datos de una columna en un cursor en Android. El objeto cursor tiene varios métodos para obtener el nombre de columna, valor de columna.Identificando el tipo de datos de una columna en un cursor de SQLite Android

Quiero averiguar el tipo de datos SQLite de la columna (texto, entero), etc ...

estoy escribiendo una función genérica para analizar un cursor y realizar operaciones. Solo tendré una cadena sql como argumento para la función.

Respuesta

6

por la documentación de SQLite (http://www.sqlite.org/datatype3.html) columnas en SQLite no tienen un tipo de datos - los valores en las columnas hacen.

Cualquier columna en una base de datos SQLite versión 3, excepto una columna INTEGER PRIMARY KEY, se puede usar para almacenar un valor de cualquier clase de almacenamiento.

Si está usando API de nivel 11 o superior, entonces el cursor apoya getType() (ver http://developer.android.com/reference/android/database/AbstractWindowedCursor.html#getType(int)).

Si está utilizando un API de nivel anterior, y usted sabe que todos los resultados en un cursor dado provenir de la misma mesa, entonces podría hacer algo así (no probado):

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

Pero esa voluntad (Espero) fallar si el cursor pasado fue (por ejemplo) el resultado de una llamada a db.rawQuery() que unió dos o más tablas.

+0

Gracias Nik, fue una idea bastante clara. ¿Pero crees que usar el Resultset de JDBC también podría usarse? He estado leyendo que Google no es compatible con JDBC. – Arun

+0

Posiblemente, no tengo una respuesta definitiva, me temo. Sin embargo, todavía estás abordando esto desde el lado equivocado. Como dije, las columnas SQLite realmente no tienen tipos de datos, es el valor en la columna el que tiene el tipo. Así que podría tener tres filas y una columna "foo", y en la fila 1 el contenido parece texto, en la fila 2 se ven como un int, y en la fila 3 el contenido parece un blob binario. El tipo de datos de la columna no ayudará. Quizás podría modificar su pregunta con más información sobre lo que realmente está tratando de lograr y puedo sugerir una solución adecuada. – Nik

+0

Consulte http://stackoverflow.com/questions/5896348/to-get-resultset-from-pre-complie-statement-in-android/7270433#7270433 para obtener más información al respecto. –

1

Debe utilizar meta data de base de datos SQLite:

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

Usted recibirá este artículo mediante el uso de getMetaData() en un conjunto de resultados().

Por lo tanto, no es la forma habitual de utilizar una base de datos SQLite en Android que te servirán, pero la forma de JDBC habitual:

  1. obtener una conexión (a través de gestor de controladores getConnection)
  2. obtener una declaración (a través de Connection.createStatement)
  3. obtener un conjunto de resultados (a través de Statement.executeQuery)
  4. obtener los metadatos (a través de resultset.getMetaData)

Saludos, Stéphane

+0

Gracias Stéphane, actualmente estoy usando una Objeto del cursor de Android (android.database.cursor) que se devuelve del método SQLiteDatabase.rawQuery. ¿Qué procedimiento debo usar para obtener un ResultSet? He estado buscando, pero no encontré la manera de conectarme a la base de datos y obtener un conjunto de resultados. – Arun

+0

String url = "jdbc: sqlite: /data/data/app.name/databases/Database"; Class.forName ("SQLite.JDBCDriver"); Conexión con = DriverManager.getConnection (url); ResultSet rs = con.createStatement(). ExecuteQuery (sql); con.close(); – Arun

+0

Pero he leído que JDBC no es compatible con Google. ¿Es aconsejable usar JDBC o el objeto incorporado android.sqlite? – Arun

5

La respuesta o NiK, están bien. Pero si su db está vacío, esta caída. sugiero utilizar

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

Esto funciona en todas las versiones de androides (API)? – IgniteCoders

1

que no se ha probado todavía, pero trato de usar cursor.getType (i)

De esta manera:

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; 
} 
Cuestiones relacionadas