¿Cómo se puede comprobar si existe una tabla en una base de datos SQLite de Android?

Tengo una aplicación de Android que necesita comprobar si ya hay un registro en la base de datos, y si no, procesar algunas cosas y, finalmente, insertarlo, y simplemente leer los datos de la base de datos si los datos existen. Estoy usando una subclase de SQLiteOpenHelper para crear y obtener una instancia reescribible de SQLiteDatabase, que pensé que automáticamente se encargó de crear la tabla si no existía ya que el código para hacerlo está en onCreate (… ) método).

Sin embargo, cuando la tabla aún NO existe, y el primer método se ejecutó sobre el objeto SQLiteDatabase que tengo es una llamada para consultar (…), mi logcat muestra un error de “I / Database (26434): sqlite returned: error code = 1, msg = no such table: appdata “, y efectivamente, la tabla appdata no se está creando.

Alguna idea sobre por qué?

Estoy buscando ya sea un método para probar si la tabla existe (porque si no lo hace, los datos ciertamente no están en él, y no necesito leerlo hasta que le escriba, lo cual parece crear la tabla correctamente), o una forma de asegurarse de que se crea, y está simplemente vacío, a tiempo para que la primera llamada consulte (…)

EDITAR
Esto fue publicado después de las dos respuestas a continuación:
Creo que pude haber encontrado el problema. Por alguna razón, decidí que se suponía que se crearía un SQLiteOpenHelper diferente para cada tabla, aunque ambos accedieran al mismo archivo de base de datos. Creo que refactorizar ese código para usar solo un OpenHelper, y crear ambas tablas dentro de onCreate puede funcionar mejor …

Prueba este:

public boolean isTableExists(String tableName, boolean openDb) { if(openDb) { if(mDatabase == null || !mDatabase.isOpen()) { mDatabase = getReadableDatabase(); } if(!mDatabase.isReadOnly()) { mDatabase.close(); mDatabase = getReadableDatabase(); } } Cursor cursor = mDatabase.rawQuery("select DISTINCT tbl_name from sqlite_master where tbl_name = '"+tableName+"'", null); if(cursor!=null) { if(cursor.getCount()>0) { cursor.close(); return true; } cursor.close(); } return false; } 

No sé nada sobre la API SQLite de Android, pero si puede hablar directamente en SQL, puede hacer esto:

 create table if not exists mytable (col1 type, col2 type); 

Lo que asegurará que la tabla siempre se crea y no arrojará ningún error si ya existió.

Aunque ya hay muchas buenas respuestas a esta pregunta, se me ocurrió otra solución que creo que es más simple. Rodee su consulta con un bloque try y la siguiente captura:

 catch (SQLiteException e){ if (e.getMessage().contains("no such table")){ Log.e(TAG, "Creating table " + TABLE_NAME + "because it doesn't exist!" ); // create table // re-run query, etc. } } 

¡Funcionó para mí!

Esto es lo que hice:

 /* open database, if doesn't exist, create it */ SQLiteDatabase mDatabase = openOrCreateDatabase("exampleDb.db", SQLiteDatabase.CREATE_IF_NECESSARY,null); Cursor c = null; boolean tableExists = false; /* get cursor on it */ try { c = mDatabase.query("tbl_example", null, null, null, null, null, null); tableExists = true; } catch (Exception e) { /* fail */ Log.d(TAG, tblNameIn+" doesn't exist :((("); } return tableExists; 

Sí, resulta que la teoría en mi edición era correcta: el problema que causaba que el método onCreate no se ejecutara, era el hecho de que los objetos SQLiteOpenHelper deberían referirse a bases de datos, y no tener una separada para cada tabla. SQLiteOpenHelper ambas tablas en un SQLiteOpenHelper resolvió el problema.

Mencionó que creó una clase que amplía SQLiteOpenHelper e implementó el método onCreate . ¿Estás asegurándote de que estás realizando todas tus llamadas de adquisición de base de datos con esa clase? Solo debe obtener objetos SQLiteDatabase través de SQLiteOpenHelper#getWritableDatabase y getReadableDatabase contrario, no se llamará al método onCreate cuando sea necesario. Si ya lo hace, compruebe y vea si se SQLiteOpenHelper#onUpgrade método SQLiteOpenHelper#onUpgrade . Si es así, entonces el número de versión de la base de datos se modificó en algún momento, pero la tabla nunca se creó correctamente cuando eso sucedió.

Como un lado, puedes forzar la recreación de la base de datos asegurándote de que todas las conexiones estén cerradas y llamar a Context#deleteDatabase y luego usar SQLiteOpenHelper para darte un nuevo objeto db.

  // @param db, readable database from SQLiteOpenHelper public boolean doesTableExist(SQLiteDatabase db, String tableName) { Cursor cursor = db.rawQuery("select DISTINCT tbl_name from sqlite_master where tbl_name = '" + tableName + "'", null); if (cursor != null) { if (cursor.getCount() > 0) { cursor.close(); return true; } cursor.close(); } return false; } 
  • sqlite mantiene la tabla sqlite_master que contiene información de todas las tablas e índices en la base de datos.
  • Entonces, aquí simplemente estamos ejecutando el comando SELECCIONAR en él, obtendremos el cursor que cuenta 1 si la tabla existe.
  public boolean isTableExists(String tableName) { boolean isExist = false; Cursor cursor = db.rawQuery("select DISTINCT tbl_name from sqlite_master where tbl_name = '" + tableName + "'", null); if (cursor != null) { if (cursor.getCount() > 0) { isExist = true; } cursor.close(); } return isExist; } 

no such table exists: error viene porque una vez que crea la base de datos con una tabla después de eso cada vez que crea una tabla en la misma base de datos, genera este error.

Para resolver este error debe crear una nueva base de datos y dentro del método onCreate () puede crear varias tablas en la misma base de datos.

….. Brindis t = Toast.makeText (context, “try …”, Toast.LENGTH_SHORT); t.show ();

  Cursor callInitCheck = db.rawQuery("select count(*) from call", null); Toast t2a = Toast.makeText(context, "count rows " + callInitCheck.getCount() , Toast.LENGTH_SHORT); t2a.show(); callInitCheck.moveToNext(); if( Integer.parseInt( callInitCheck.getString(0)) == 0) // if no rows then do { // if empty then insert into call 

…..