Obtención del tipo de una columna en SQLite

Mi compañero hizo la base de datos para mi aplicación para Android. Por ejemplo, una de las tablas se crea así:

CREATE TABLE table1( id_fields_starring INTEGER PRIMARY KEY AUTOINCREMENT , fields_descriptor_id INTEGER NOT NULL , starring_id INTEGER NOT NULL , form_mandatory INTEGER NOT NULL DEFAULT 1 , form_visible INTEGER NOT NULL DEFAULT 1 , FOREIGN KEY(fields_descriptor_id) REFERENCES pr_fields_descriptor(id_fields_descriptor) ON DELETE CASCADE ON UPDATE CASCADE , FOREIGN KEY(starring_id) REFERENCES starring(id_starring) ON DELETE CASCADE ON UPDATE CASCADE ) 

De los campos de una tabla necesito saber cuál de ellos es INTEGER NOT NULL y que es INTEGER NOT NULL DEFAULT 1 , porque para el primer caso debo crear EditText un EditText y para el segundo caso debo crear un CheckBox . ¿Alguna idea?

2 Solutions collect form web for “Obtención del tipo de una columna en SQLite”

Vocación:

 PRAGMA table_info(table1); 

Volcará la información de la tabla, por ejemplo

 cid|name |type |notnull |dflt_value |pk 0 |id_fields_starring |INTEGER |0 | |1 1 |fields_descriptor_id |INTEGER |1 | |0 2 |starring_id |INTEGER |1 | |0 3 |form_mandatory |INTEGER |1 |1 |0 4 |form_visible |INTEGER |1 |1 |0 

Y simplemente encuentre la fila en el cursor con notnull=1 y dflt_value=1


Editar:

Para enumerar todas las columnas definidas como INTEGER NOT NULL DEFAULT 1 esto funcionaría ( helper es su instancia de SQLiteOpenHelper ):

 SQLiteDatabase db = helper.getWritableDatabase(); Cursor cursor = db.rawQuery("PRAGMA table_info(table1)", null); try { int nameIdx = cursor.getColumnIndexOrThrow("name"); int typeIdx = cursor.getColumnIndexOrThrow("type"); int notNullIdx = cursor.getColumnIndexOrThrow("notnull"); int dfltValueIdx = cursor.getColumnIndexOrThrow("dflt_value"); ArrayList<String> integerDefault1NotNull = new ArrayList<String>(); while (cursor.moveToNext()) { String type = cursor.getString(typeIdx); if ("INTEGER".equals(type)) { // Integer column if (cursor.getInt(notNullIdx) == 1) { // NOT NULL String defaultValue = cursor.getString(dfltValueIdx); if ("1".equals(defaultValue)) { integerDefault1NotNull.add(cursor.getString(nameIdx)); } } } } System.out.println("integerDefault1NotNull now contains a list of all columns " + " defined as INTEGER NOT NULL DEFAULT 1, " + integerDefault1NotNull); } finally { cursor.close(); } 

Para aquellos de ustedes que buscan hacer esto de forma programática en Xamarin tal vez (como yo) puede ejecutar la consulta PRAGMA contra una SQLiteConnection de la siguiente manera:

 connection.Query<SqliteColumninfo>($"PRAGMA table_info({tableName})"); 

No pude encontrar un objeto definido en el paquete de Sqlite de PCL para recoger el resultado así que creé una clase para recoger los componentes antes mencionados:

 public class SqliteColumninfo { public string Cid { get; set; } public string Name { get; set; } public string Type { get; set; } public int NotNull { get; set; } public int Dflt_Value { get; set; } public int PK { get; set; } } 
  • Varios Table SQLite DB Adapter (s) en Android?
  • Android - SQLiteException: near "=": error de sintaxis (código 1)
  • Alternativas de SQLite para Android
  • Obteniendo una Suma de SQLite en Java en Android
  • Android y SQLite - recupera el ID máximo de la tabla
  • IllegalArgumentException: columna no válida
  • Android actualización SQLite DB esquema?
  • Cómo hacer frente a múltiples cambios en la versión de la base de datos cuando se actualiza la aplicación Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.