Causado por: android.database.sqlite.SQLiteException: no hay tal tabla: (código 1) Android
Tenemos una base de datos sqlite en nuestra aplicación. Su funcionamiento muy bien para todos los usuarios, pero pocos de ellos experimentando el Caused by: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings
error.
A continuación se muestra mi clase auxiliar sqlite para crear el db y el registro de errores. En assert/Master.db
tenemos la tabla generalSettings
. Pero después de copiarlo al dispositivo la tabla falta. Esto está ocurriendo sólo para pocos usuarios. Busqué la solución, pero no puedo encontrar la exacta. Equipo por favor ayúdeme a arreglar esto.
- Android SQLite nueva versión de DB con una tabla eliminada
- Copia de seguridad de la base de datos
- SQLiteDiskIOException con el código de error 10: error de E / S de disco
- ¿Se llama el método onUpgrade?
- insertar si no existe otra actualización en sqlite android
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
- El conjunto de conexiones de la base de datos '/data/data/msv_database.db' no ha podido conceder una conexión. Conexiones: 0 activo, 1 inactivo, 0 disponible
- SQLiteAssetHelper: No se pudo abrir la base de datos para escribir (intentará leer sólo)
- Base de datos Android SQLite Después de eliminar la tabla, ¿el id comienza desde 1?
- ¿Cómo debo notificar al usuario que SQLite Asset Helper está cargando la base de datos por primera vez?
- Obtener el ID de un nuevo registro insertado en una base de datos de la Uri devuelto
- La base de datos SQLite no aparece en el Explorador de archivos
- Sqlite devuelto: error code = 1, msg = no tal columna: kitchen1
- Android cola las solicitudes de HTTP mientras la red no está disponible y procesa cuando se enciende
El problema es que algunos dispositivos están actualizando su aplicación, por lo que el checkDataBase()
devuelve true
, por lo que no está llamando a copyDataBase()
. Por lo que está utilizando base de datos anterior que no tiene generalSettings
tabla. 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); }
Otra posible solución es simplemente desinstalar una aplicación del emulador de Android y después de ejecutarlo de nuevo.
Si sólo desea 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"
Después de pasar un par de horas me dieron esta solución:
1) Configuración> Administrador de aplicaciones
2) Seleccionar aplicación
3) Borrar datos
4) Desinstalar la aplicación
Ahora ejecuta la aplicación desde Android Studio
Espero que esto funcione correctamente
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 aumente DATABASE_VERSION con +1.
Es una excepción de actualización. Asegúrese de tener la tabla en su base de datos anterior. Si no, crearlo. PS: si estás recién desarrollando esta aplicación, desinstala de tu emulador o de tu dispositivo y vuelve a instalarlo. Pero su no recomendado para los datos ne ne perdido.
1. Cambie su versión de DataBase o primero desinstale sus aplicaciones en el emulador o teléfono y vuelva a instalar. De esta manera piensa en tu problema Se resolverá.
Si está utilizando GreenDao y recibe este error, asegúrese de que está unistalling la aplicación e inténtelo de nuevo. Esto resolvió mi problema
Supongamos que si ejecuta la aplicación con la Versión 1 de la base de datos, si cambia la estructura de la tabla o agrega una nueva tabla, debe aumentar la Versión de la base de datos a 2 y más si realiza más cambios en ella.
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 realiza alguna modificación.
- Manejo de botones dentro de las notificaciones de Android
- ¿Cómo expandir el tamaño de una instancia de dispositivo virtual Android (emulador)?