Sugar ORM simplemente no creará tablas

Estoy trabajando en un proyecto de biblioteca independiente que requiere persistir un modelo simple. Aquí es cómo se ve mi SugarRecord :

 /** * Keeping track of previously received messages by ID */ public class MessageRequestIdModel extends SugarRecord { protected String messageRequestId; public MessageRequestIdModel() { } public MessageRequestIdModel(String messageRequestId) { this.messageRequestId = messageRequestId; } public String getMessageRequestId() { return this.messageRequestId; } public static boolean exists(String id) { return MessageRequestIdModel.find( MessageRequestIdModel.class, "messageRequestId = ?", id ).size() != 0; } } 

En una clase de repositorio, intento persistir llamando a este método:

 @Override public void save(MessageRequestId messageRequestId) { new MessageRequestIdModel(messageRequestId.getId()).save(); } 

Ahora intento probar esto usando un android.test.InstrumentationTestCase donde paso un Context al azúcar como así:

 SugarContext.init(getInstrumentation().getContext()); 

Esto resulta en este error cuando ejecuto la prueba: (truncando para mantener esta pregunta una lectura sucinta)

 android.database.sqlite.SQLiteException: no such table: MESSAGE_REQUEST_ID_MODEL (code 1): , while compiling: INSERT or REPLACE... 

Solución de problemas Ya he intentado:

  • Mantener un Manifiesto diferente para que el paquete de prueba pase el nombre del paquete .test a SugarORM. No hay cambios en el comportamiento
  • Adición de un MessageRequestIdModel.findById(MessageRequestIdModel.class, (long) 1); como en los demás puestos de SO. Cambia el error a sí mismo (muestra full stack-trace aquí en caso de que ayude):

     android.database.sqlite.SQLiteException: no such table: MESSAGE_REQUEST_ID_MODEL (code 1): , while compiling: SELECT * FROM MESSAGE_REQUEST_ID_MODEL WHERE id=? LIMIT 1 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:1316) at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1163) at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1034) at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1240) at com.orm.SugarRecord.find(SugarRecord.java:192) at com.orm.SugarRecord.findById(SugarRecord.java:102) at pm.tin.apprise.entities.message_request_ids.MessageRequestIdModelRepository.save(MessageRequestIdModelRepository.java:19) 
  • He intentado quitar todos los Sugar ORM config del Manifiesto como sugerido por muchos – esto no cambia nada

  • He intentado crear un módulo de aplicación de ejemplo y he intentado ejecutarlo como un caso de prueba para esa aplicación, en caso de que las aplicaciones independientes no obtuvieran los recursos adecuados en el emulador / dispositivo (he probado en ambos)

  • He intentado incrementar el número VERSION para la base de datos

  • He intentado cambiar a ActivityTestCase y usar getActivity().getApplicationContext() . Esto esencialmente falla con un error que sugiere que este Contexto es incompleto para poder configurar SQLite

Como se puede ver, he empujado duro en esta roca toda la noche, pero en este punto parece Sisyphean y no tengo absolutamente ninguna ventaja para mi siguiente intento de depuración que no sea usar un ORM diferente de Sugar (que en realidad no parecen ser el problema). No hay nada más emasculating que no ser capaz de ejecutar SQLite en un caso de prueba y lloro a la Holy Programmer Consciousness en usted por ayuda: – '(

3 Solutions collect form web for “Sugar ORM simplemente no creará tablas”

Este problema se ha observado en las versiones Android Studio 2.xx-beta (lo más notablemente 2.0.0-beta6) y tiene su causa raíz en la característica 'Instant Run'.

Me imagino que esto se puede arreglar en breve, pero para que esto funcione mientras tanto, debe desactivar la función en el siguiente menú

File | Settings | Build, Execution, Deployment | Instant Run

La limpieza y luego la creación de la aplicación deben resolver estos problemas.

Puede ver el informe de errores de azúcar relacionado aquí .

Esto debería resolver de forma concluyente este problema para todas las personas que están luchando para obtener Sugar ORM para trabajar fuera de la caja – utilizar el sistema de versionado de SQL para disparar manualmente la creación de SQL.

En el caso de uso anterior, aquí es cómo lo haces:

1.) Cambiar la versión de DB de la configuración de Sugar ORM config a un nuevo número (digamos N ) tal que sea mayor que la versión actual O cambiar el nombre de la base de datos

2.) Cree un archivo ModuleName/src/main/assets/sugar_upgrades/<N>.sql con su SQL; mostrando el mío, en caso de que ayude:

DROP TABLE MESSAGE_REQUEST_ID_MODEL;

CREATE TABLE MESSAGE_REQUEST_ID_MODEL (ID INTEGER PRIMARY KEY AUTOINCREMENT, MESSAGE_REQUEST_ID CHAR (128));

Esto obligará a Sugar a disparar su SQL para crear la tabla para usted (aunque manualmente).

Notas adicionales

  • Esta sección del manual Sugar ORM es la inspiración detrás de esta solución (aunque hacky): http://satyan.github.io/sugar/migration.html
  • He comentado el nombre del paquete de Sugar config
  • Sugar trabaja con un Contexto de Aplicación de Instrumentación. En una clase base de InstrumentationTestCase , simplemente haga SugarContext.init(getInstrumentation().getTargetContext()) como se muestra en la pregunta original

su problema puede ser la creación de clase …

 public class MessageRequestIdModel extends SugarRecord<MessageRequestIdModel> { protected String messageRequestId; public MessageRequestIdModel() { } public MessageRequestIdModel(String messageRequestId) { this.messageRequestId = messageRequestId; } public String getMessageRequestId() { return this.messageRequestId; } public static boolean exists(String id) { return MessageRequestIdModel.find( MessageRequestIdModel.class, "messageRequestId = ?", id ).size() != 0; } } 

vuelva a comprobar con mi código.

  • Almacenamiento y recuperación de datos no ingleses en la base de datos sqlite en android
  • Cómo utilizar correctamente claves foráneas en Android, utilizando SQLite y OrmLite
  • Error al abrir la base de datos / Error al cambiar la configuración regional de (base de datos) a 'en_US'
  • La concurrencia de webview de Android causó SQLiteException: la base de datos está bloqueada
  • ¿Por qué algunos métodos SQLite esperan argumentos como un objeto , mientras que otros necesitan una cadena ?
  • Configuración de args de selecciones múltiples en la consulta de base de datos SQLite
  • SQLiteConstraintException: código de error 19: falla de restricción
  • Android sqlite cómo comprobar si existe un registro
  • Inserte un número de cadena que empiece por cero en la columna de cadena usando ContentValues, pero el cero inicial siempre se elimina
  • ¿Puede Universal loader de imágenes para Android trabajar con imágenes de sqlite db?
  • Android NullPointerException al ejecutar la consulta en la base de datos SQLite
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.