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).
- No se puede abrir el error de archivo de base de datos al utilizar consultas posteriores
- Cómo borrar un Android ListView y llenarlo con nuevos datos?
- Insertar 1000000 filas en la base de datos sqlite3
- ¿Es posible simular el cursor sqlite3 en Android cuando no existe db o tabla?
- Crear una restricción única en el conflicto reemplazar
- Eliminar varias filas de contentprovider
- Carácter turco en SQLite mientras utiliza la expresión LIKE
- Instalación y configuración de SQlite Browser en LINUX
- ABORTO: HEAP MEMORY CORRUPTION en NDK env. (Biblioteca POCO, Sqlite3, Cocos2dx)
- Android SQLite ON CONFLICT UPDATE es posible?
- Ejecución de varias sentencias con SQLiteDatabase.execSQL
- Sqlite en Android: Cómo crear una función sqlite dist db - que se utilizará en la aplicación para calcular la distancia utilizando lat, largo
- Exportar archivo de base de datos sqlite en XML y luego en la hoja de cálculo de Excel
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; }
- Cómo establecer el margen dinámicamente en Android?
- ¿Hay alguna manera de pedir permiso mediante programación?