sugarapp such sqlitelog sqliteexception library android sqlite gpuimage sugarorm

android - sqlitelog - sqliteexception: no such table



Android: Sugar ORM No existe tal excepción de tabla (20)

¿Intentaste cambiar la versión a 2 ??? Esta podría ser una versión diferente, intente con otros valores también.

Además, asegúrese de tener un constructor vacío en sus clases de SugarRecord.

Cambiar el nombre de la base de datos si está utilizando, entonces es otro aprobado.

Si está creando la tabla sin desinstalar la aplicación, haga el número de versión +1.

Estoy obteniendo la excepción de No Such table cuando estoy usando Sugar ORM con GPU image Android Library . Estoy usando Gradle y Android Studio. Una vez que elimine la imagen de GPU este problema se resuelve. Así que no sé qué está causando esta excepción. Los detalles sobre esta excepción también se están discutiendo en este tema de git y parece que muchas personas todavía lo enfrentan.

Mi registro de fallos se publica a continuación

> 10-09 11:30:21.511 4326-4831/com.example.app E/SQLiteLog: (10) Failed > to do file read, got: 0, amt: 100, last Errno: 2 10-09 11:30:26.506 > 4326-4831/com.example.app E/SQLiteLog: (1) no such table: IMAGE 10-09 > 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: FATAL > EXCEPTION: AsyncTask #1 10-09 11:30:26.516 4326-4831/com.example.app > E/AndroidRuntime: java.lang.RuntimeException: An error occured while > executing doInBackground() 10-09 11:30:26.516 > 4326-4831/com.example.app E/AndroidRuntime: at > android.os.AsyncTask$3.done(AsyncTask.java:299) 10-09 11:30:26.516 > 4326-4831/com.example.app E/AndroidRuntime: at > java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) > 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: at > java.util.concurrent.FutureTask.setException(FutureTask.java:219) > 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: at > java.util.concurrent.FutureTask.run(FutureTask.java:239) 10-09 > 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: at > android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 10-09 > 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) > 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) > 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: at > java.lang.Thread.run(Thread.java:838) 10-09 11:30:26.516 > 4326-4831/com.example.app E/AndroidRuntime: Caused by: > android.database.sqlite.SQLiteException: no such table: IMAGE (code > 1): , while compiling: SELECT * FROM IMAGE 10-09 11:30:26.516 > 4326-4831/com.example.app E/AndroidRuntime: at > android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native > Method) 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: > at > android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:886) > 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: at > android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:497) > 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: at > android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) > 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: at > android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) > 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: at > android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 10-09 > 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: at > android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) > 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: at > android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314) > 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: at > android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161) > 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: at > android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032) > 10-09 11:30:26.516 4326-4831/com.example.app E/AndroidRuntime: at > android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1238)


Asegúrese de que el nombre del paquete de metadatos apunta a donde ha puesto sus entidades modelo y no el nombre del paquete de la aplicación


Como lo mencionaron otros, la ejecución instantánea de Android Studio podría ser el problema (problema conocido de SugarORM ), intente desactivarlo.

Sin embargo, he tenido el mismo problema, y ​​eso no fue suficiente para mí, el problema persistió. allowBackup="true" esto cambiando allowBackup="true" en mi manifiesto a false , ejecutando la aplicación, y elimine> reinstalar la aplicación después.

Por qué supongo que ese es el problema: descubrí que mis preferencias se guardaron incluso después de la reinstalación. Si esto también le sucede a la tabla de SQL dañada (debido a la ejecución instantánea), incluso la reinstalación no lo arreglaría. Mi problema se solucionó inmediatamente después de cambiar allowBackup a falso y reinstalarlo. Todavía no puedo reproducir el error, por lo que tampoco puedo reproducir la solución.

Espero que esta adición pueda ayudar a alguien de dolores de cabeza como yo!


Como se indica en el archivo README del repositorio de github, si está utilizando proguard, debe asegurarse de que las entidades permanezcan sin ofuscación para que la tabla y las columnas se nombren correctamente.

Para hacerlo, agregue esta línea a proguard-rules.pro :

-keep class com.yourpackage.yourapp.domainclasspackage.** { *; }


Cuando esté iniciando el desarrollo inicial y no desee aumentar la versión de su base de datos para los cambios realizados durante las iteraciones rápidas de sus modelos (algo que hago mucho mientras cumplo con requisitos imprevistos), use esto durante el inicio de sus aplicaciones -arriba:

SugarDb sugarDb = new SugarDb(getApplicationContext()); new File(sugarDb.getDB().getPath()).delete(); Model.findById(Model.class, (long) 1); // Perform this for each SugarRecord model // Insert test data: Modelrecord = new Model("Model Title", "Model content", false); record.save();

Tenga cuidado : esto eliminará todos los datos de su base de datos, por lo que los cambios persistentes entre sesiones de depuración no funcionarán, sin embargo, le permite lanzar la versión 1 de su aplicación, la versión 1 de su base de datos.

No recomiendo hacer esto después de que la versión 1 se haya lanzado oficialmente, asegúrese de registrar TODOS los cambios necesarios utilizando el Método de migración de SugarORM .


Deshabilite su ejecución instantánea vaya a Archivo> Configuraciones> Compilación, Ejecución, Implementación> Ejecución instantánea


En mi caso es problema de la biblioteca Sugar. Tiene un método incorrecto para obtener clases de dominio (com.orm.util.ReflectionUtil # getDomainClasses). El método siempre devuelve ninguna clase. Así que Sugar no puede inicializar las tablas de la base de datos. Me he rebajado a gradle 1.3.0 (ese método funciona correctamente) y el problema desapareció.


En mi caso, quité la siguiente línea de AndroidManifest.xml y ¡funciona!


Estaba enfrentando el mismo problema. Deshabilitar "Ejecución instantánea" no resolvió el problema. Yo tampoco habilité proguard Más tarde eliminé todos los metadatos de sugarORM del manifiesto de Android (excepto el registro de consultas) y eso resolvió el problema. Así que elimina las siguientes 3 líneas del manifiesto de Android:

<meta-data android:name="DATABASE" android:value="edikodik.db" /> <meta-data android:name="VERSION" android:value="2" /> <meta-data android:name="QUERY_LOG" android:value="true" />

EDITAR: según el comentario de jrhamza, si la solución anterior no funciona, intente deshabilitar la ejecución instantánea.


Estoy usando la versión 1.5 y he intentado muchas maneras aquí pero no funciona.

¡Y encontré la solución!

Esto forzará a crear tablas al iniciar la aplicación:

public class SugarOrmTestApplication extends SugarApp { @Override public void onCreate() { super.onCreate(); SugarContext.init(getApplicationContext()); // create table if not exists SchemaGenerator schemaGenerator = new SchemaGenerator(this); schemaGenerator.createDatabase(new SugarDb(this).getDB()); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } @Override public void onLowMemory() { super.onLowMemory(); } @Override public void onTerminate() { super.onTerminate(); SugarContext.terminate(); } }


Para crear tablas de modelos, uso para ejecutar esto para todos mis modelos una vez que mi aplicación se inicie:

Book.findById(Book.class, (long) 1); Car.findById(Car.class, (long) 1);

Mi aplicación extiende SugarApp, por lo que obliga a Sugar a crear todas las tablas.

Por otro lado, para actualizar su base de datos, tiene que cambiar su versión a 2.

Y, por último, tener un constructor vacío es una necesidad.

¡Espero que esto ayude! ;)


Para mí, el problema era: En mi aplicación tenía dos bases de datos diferentes. así que, solo cambié la versión 1 a la versión 2. Mi primer DB tenía la versión 1


Resuelto

No lo sé, pero el SugarDb.onCreate no se llama. Así que ponga este código en MainActivity.onCreate y el ORM de Sugar funcionará

SugarDb db = new SugarDb(this); db.onCreate(db.getDB());


Si agrega un nuevo modelo (nueva tabla) en su código, necesita cambiar la versión de la base de datos en el archivo Manifest. Nuevo valor> Valor anterior (actualización)

<meta-data android:name="VERSION" android:value="1"/>


También estaba teniendo este problema, mi clase solo tenía 1 propiedad String. Estaba usando la versión 1.3. Solo comente este código desde el archivo AndroidManifest.xml y ya está listo :)

<meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="com.project.database.entities" />

Referencia:

https://github.com/satyan/sugar/issues/75


También me enfrenté a este problema. Después de 2 días de caza, lo resolví siguiendo trucos En el estudio de Android

Paso 1. Escribir compilación ''com.github.satyan: sugar: 1.5'' en dependencias en el archivo build.gradle de la aplicación

Paso 2. Escribe classpath ''com.android.tools.build:gradle:2.1.0'' en las dependencias del archivo build.gradle del proyecto

Paso 3. La versión de DB debe ser mayor que 1 siempre como se documenta en sugarORM


Tuve el mismo problema y lo resolví, no deshabilitando la ejecución instantánea, sino cambiando mi:

<meta-data android:name="VERSION" android:value="1" />

a

<meta-data android:name="VERSION" android:value="2" />

Dado que el valor más bajo debe ser 2


Tuve el mismo problema, está relacionado con la ejecución instantánea. Deshabilita la ejecución instantánea, reinstala la aplicación y funciona.

Vea este enlace para obtener detalles sobre cómo habilitar o deshabilitar la ejecución instantánea.


Tuve este problema Ejecuté todas las sugerencias publicadas aquí. Pero tampoco funcionó. Luego apliqué todos juntos, y finalmente me deshice de ese problema. Lo que hice-

1. Disabled instant run. (as Parth Vora said.) 2. Then I added the following class- import android.app.Application; import android.content.res.Configuration; import com.orm.SugarApp; import com.orm.SugarContext; public class SugarOrmTestApplication extends SugarApp { @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } @Override public void onCreate() { super.onCreate(); SugarContext.init(getApplicationContext()); Book.findById(Book.class, (long) 1); } @Override public void onLowMemory() { super.onLowMemory(); } @Override public void onTerminate() { super.onTerminate(); } } 3. Modified manifest file- <application //Added the following lines- android:name="SugarOrmTestApplication"> <meta-data android:name="DATABASE" android:value="sugar_example_new.db" /> <meta-data android:name="VERSION" android:value="2" /> <meta-data android:name="QUERY_LOG" android:value="true" /> </application>

Y este es mi modelo de clase.

public class Book extends SugarRecord { String title; String edition; public Book(){ } public Book(String title, String edition){ this.title = title; this.edition = edition; } }

Ahora mi aplicación funciona bien.


Si está utilizando Android Studio 2.0

Teniendo el mismo problema!

Así que la ejecución instantánea no es compatible con Sugar ORM

  • ajuste abierto
  • ahora ejecuta tu proyecto

¡Disfrutar!