tutorial studio room español ejemplo descargar dbhelper android android-sqlite

room - sqlite android studio 2018



Causado por: android.database.sqlite.SQLiteException: no existe tal tabla:(código 1) Android (9)

Tenemos una base de datos sqlite en nuestra aplicación. Está funcionando bien para todos los usuarios, pero pocos de ellos experimentan la Caused by: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings error Caused by: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings .

A continuación se encuentra mi clase de ayuda sqlite para crear la base de datos y el registro de errores. En assert/Master.db tenemos la tabla generalSettings . Pero después de copiarlo en el dispositivo, falta la tabla. Esto está sucediendo sólo para pocos usuarios. Busqué la solución pero no puedo encontrar la exacta. Equipo por favor ayúdame a arreglar esto.

Código:

import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.io.StringWriter; import android.content.Context; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.util.Log; public class InstallDB extends SQLiteOpenHelper { Context ctx; String DBNAME; String DBPATH; Modules modObj = new Modules(); public InstallDB(Context context, String name) { super(context, name, null, 1); this.ctx = context; this.DBNAME = name; this.DBPATH = this.ctx.getDatabasePath(DBNAME).getAbsolutePath(); Log.e("Path 1", DBPATH); } public void createDataBase() { boolean dbExist = checkDataBase(); SQLiteDatabase db_Read = null; if (!dbExist) { synchronized (this) { db_Read = this.getReadableDatabase(); Log.e("Path 2", this.getReadableDatabase().getPath()); db_Read.close(); copyDataBase(); Log.v("copyDataBase---", "Successfully"); } // try { // } catch (IOException e) { // throw new Error("Error copying database"); // } } } private boolean checkDataBase() { SQLiteDatabase checkDB = null; try { String myPath = DBPATH; checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); } catch (Exception e) { Log.i("SQLite Error", "database does''t exist yet."); } if (checkDB != null) { checkDB.close(); } return checkDB != null ? true : false; } private void copyDataBase() { try { InputStream myInput = ctx.getAssets().open(DBNAME); String outFileName = DBPATH; OutputStream myOutput = new FileOutputStream(outFileName); byte[] buffer = new byte[1024 * 3]; int length = 0; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } myOutput.flush(); myOutput.close(); myInput.close(); } catch (Exception e) { Modules.stacTaceElement = e.getStackTrace(); StringWriter stackTrace1 = new StringWriter(); e.printStackTrace(new PrintWriter(stackTrace1)); System.err.println(stackTrace1); Intent send = new Intent(Intent.ACTION_SENDTO); String uriText; uriText = "mailto:[email protected]" + "&subject=Error Report" + "&body=" + stackTrace1.toString(); uriText = uriText.replace(" ", "%20"); Uri uri = Uri.parse(uriText); send.setData(uri); ctx.startActivity(Intent.createChooser(send, "Send mail...")); // TODO: handle exception } } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }

Registro de errores:

java.lang.RuntimeException: Unable to start activity ComponentInfo{palmagent.FidelityAgent.Two/palmagent.FidelityAgent.Two.PassNew}: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269) at android.app.ActivityThread.access$800(ActivityThread.java:139) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5102) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(Native Method) Caused by: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314) at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253) at palmagent.FidelityAgent.Two.masterDatabase.selectquery(masterDatabase.java:59) at palmagent.FidelityAgent.Two.Modules.checkDatabase(Modules.java:28825) at palmagent.FidelityAgent.Two.PassNew$LoaduserDetails.onPreExecute(PassNew.java:140) at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587) at android.os.AsyncTask.execute(AsyncTask.java:535) at palmagent.FidelityAgent.Two.PassNew.onCreate(PassNew.java:120) at android.app.Activity.performCreate(Activity.java:5248) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173) ... 11 more


1. Cambie la versión de su base de datos o primero desinstale sus aplicaciones en el emulador o el teléfono y vuelva a instalarlas. Yo de esta manera Piensa que tu problema será resuelto.


Después de pasar un par de horas conseguí esta solución:

1) Configuración> Administrador de aplicaciones

2) Seleccione la aplicación

3) Borrar datos

4) Desinstalar la aplicación

Ahora ejecuta la aplicación de Android Studio

Espero que esto funcione correctamente


El problema se debe a que algunos dispositivos están actualizando su aplicación, por lo que checkDataBase() devuelve true , por lo que no está llamando a copyDataBase() . Por lo tanto, está utilizando una base de datos anterior que no tiene la tabla de generalSettings . Para resolver este intento:

@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(newVersion>oldVersion) copyDatabase(); }

y también actualizar su constructor:

public InstallDB(Context context, String name) { super(context, name, null, DB_VERSION); // DB_VERSION is an int,update it every new build this.ctx = context; this.DBNAME = name; this.DBPATH = this.ctx.getDatabasePath(DBNAME).getAbsolutePath(); Log.e("Path 1", DBPATH); }


Es una excepción de actualización. Asegúrese de tener la tabla en su base de datos anterior. Si no, créelo. PD: si es una aplicación nueva, desinstálela de su emulador o dispositivo y vuelva a instalarla. Pero no se recomienda para los datos ne perdido.


Este error se produce porque no está utilizando DATABASE_VERSION

public class DatabaseHelper extends SQLiteOpenHelper { private static SQLiteDatabase sqliteDb; private static DatabaseHelper instance; private static final int DATABASE_VERSION = 1;

Aumente su versión cada vez que realice cambios en su base de datos, solo aumente DATABASE_VERSION con +1 ..


Incluso si ha codificado para pocas tablas y actualizado la base de datos, su aplicación se bloqueará. Lo que tienes que hacer es que para cada una de las tablas crear cambios en la base de datos, actualizar la DATABASE_VERSION

Si tiene pocas clases de DatabaseHelper ( lea esto ), debe agregar este método a su ayudante de db:

@Override public void onOpen(SQLiteDatabase db) { onCreate(db); }


Otra solución posible es simplemente desinstalar una aplicación del emulador de Android y luego ejecutarla nuevamente.

Si solo quieres eliminar una aplicación:

1.Start the emulator. 2.Open the Android settings app. 3.Select "Applications" (Called "Apps" on Android 4.0 or higher) 4.Select "Manage Applications" (Only on Android 3.2 or lower) 5.Select the application you want to uninstall. 6.Click "Uninstall"


Si está utilizando GreenDao y recibe este error, asegúrese de que está desinstalando la aplicación e intente nuevamente. Esto solucionó mi problema


Supongamos que si ejecuta su aplicación con la versión 1 de la base de datos, si altera la estructura de la tabla o agrega una nueva, debe aumentar la versión de la base de datos a 2 y más si hace más cambios.

public class AppDatabase extends SQLiteOpenHelper { // Database Name private static final String DATABASE_NAME = "myDatabase"; // Database Version private static final int DATABASE_VERSION = 1; public AppDatabase(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } }

Aumente este valor DATABASE_VERSION si se realizan modificaciones.