Comprobación de la existencia de una columna en una base de datos de aplicaciones en Android

¿Hay una manera agradable en Android de ver si existe una columna en una tabla en la base de datos de la aplicación? (Ya sé que hay preguntas similares a esta ya, pero no parece haber ninguna que sea específica de Android).

cursor.getColumnIndex(String columnName) devuelve -1 si, la columna no existe. Así que, básicamente, realizar una simple consulta como "SELECT * FROM xxx LIMIT 0,1" y utilizar el cursor para determinar si la columna, que está buscando, existe

O

Puede intentar consultar la columna "SELECT theCol FROM xxx" y capturar una excepción

Mi función basada en la respuesta @martinpelants:

 private boolean existsColumnInTable(SQLiteDatabase inDatabase, String inTable, String columnToCheck) { Cursor mCursor = null; try { // Query 1 row mCursor = inDatabase.rawQuery("SELECT * FROM " + inTable + " LIMIT 0", null); // getColumnIndex() gives us the index (0 to ...) of the column - otherwise we get a -1 if (mCursor.getColumnIndex(columnToCheck) != -1) return true; else return false; } catch (Exception Exp) { // Something went wrong. Missing the database? The table? Log.d("... - existsColumnInTable", "When checking whether a column exists in the table, an error occurred: " + Exp.getMessage()); return false; } finally { if (mCursor != null) mCursor.close(); } } 

Simplemente llame a:

 boolean bla = existsColumnInTable(myDB,"MyTable","myColumn2check"); 

Realmente escribí esta función que parece bastante limpia:

 private boolean field_exists( String p_query ) { Cursor mCursor = mDb.rawQuery( p_query, null ); if ( ( mCursor != null ) && ( mCursor.moveToFirst()) ) { mCursor.close(); return true ; } mCursor.close(); return false ; } 

Lo llamo así:

 if ( field_exists( "select * from sqlite_master " + "where name = 'mytable' and sql like '%myfield%' " )) { do_something ; } 

Aquí está mi solución al problema que se suma a la solución de flexo un poco.

Puede poner este método en cualquier clase, tal vez su clase extendiendo SQLiteOpenHelper.

 public static boolean columnExistsInTable(SQLiteDatabase db, String table, String columnToCheck) { Cursor cursor = null; try { //query a row. don't acquire db lock cursor = db.rawQuery("SELECT * FROM " + table + " LIMIT 0", null); // getColumnIndex() will return the index of the column //in the table if it exists, otherwise it will return -1 if (cursor.getColumnIndex(columnToCheck) != -1) { //great, the column exists return true; }else { //sorry, the column does not exist return false; } } catch (SQLiteException Exp) { //Something went wrong with SQLite. //If the table exists and your query was good, //the problem is likely that the column doesn't exist in the table. return false; } finally { //close the db if you no longer need it if (db != null) db.close(); //close the cursor if (cursor != null) cursor.close(); } } 

Si utiliza ActiveAndroid

 public static boolean createIfNeedColumn(Class<? extends Model> type, String column) { boolean isFound = false; TableInfo tableInfo = new TableInfo(type); Collection<Field> columns = tableInfo.getFields(); for (Field f : columns) { if (column.equals(f.getName())) { isFound = true; break; } } if (!isFound) { ActiveAndroid.execSQL("ALTER TABLE " + tableInfo.getTableName() + " ADD COLUMN " + column + " TEXT;"); } return isFound; } 
  • Android SQLite ORDER BY no funciona
  • CompileStatement o db.insert en android
  • Obtención de base de datos SQLite por adb shell en cmd
  • Filtrar el parámetro ListView por 'selección' en CursorLoader
  • Orden de inserción de SQLite vs orden de consulta?
  • Cómo obtener nombres de columna con datos de consulta en sqlite3?
  • SQLiteDatabase.insert () devuelve rowid incorrecto para tablas virtuales
  • Razones para utilizar la base de datos SQLite legible
  • Recuperación del valor nulo de la base de datos Sqlite en android
  • ¿Cuál es el modo de subprocesamiento predeterminado de SQLite en Android?
  • Cursor.getType () y CursorIndexOutOfBoundsException excepción
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.