sugar such library example android sqlite android-sqlite android-testing sugarorm

such - sqlite library android



Sugar ORM simplemente no creará tablas (3)

Este problema se ha observado en las versiones de Android Studio 2.xx-beta (más notablemente 2.0.0-beta6) y tiene su causa raíz en la función ''Ejecución instantánea''.

Me imagino que esto puede solucionarse 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

Limpiar y luego construir la aplicación debería resolver estos problemas.

Puede ver el informe relacionado con los errores de Sugar aquí .

Estoy trabajando en un proyecto de biblioteca independiente que requiere la persistencia de 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 a Sugar como tal:

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

Esto produce este error cuando ejecuto la prueba: (truncando para que esta pregunta sea 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 que ya he intentado:

  • Mantener un Manifiesto diferente para que el paquete de prueba pase el nombre del paquete .test a SugarORM. Ningún cambio en el comportamiento.
  • Agregar un MessageRequestIdModel.findById(MessageRequestIdModel.class, (long) 1); Como en las otras publicaciones de SO. Cambia el error a sí mismo (mostrando el seguimiento completo de la pila 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 eliminar todas las configuraciones de Sugar ORM del Manifiesto como lo sugieren muchos, esto no cambia nada

  • He intentado crear un módulo de aplicación de muestra e 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 (los he probado en ambos)

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

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

Como puede ver, he presionado fuerte en esta roca durante toda la noche, pero en este punto parece ser Sisyphean y no tengo ninguna ventaja en mi próximo intento de depuración, aparte de usar un ORM diferente al de Sugar (que en realidad no parece ser el problema). No hay nada más fascinante que no poder ejecutar SQLite en un caso de prueba y lloro a la Conciencia Sagrada del Programador en su ayuda: - ''(


Esto debería resolver de manera concluyente este problema para todas las personas que luchan por conseguir que el ORM de Sugar funcione de forma inmediata: use el sistema de control de versiones de SQL para iniciar manualmente la creación de SQL.

En el caso de uso anterior, aquí está cómo hacerlo:

1.) Cambie la versión de DB de Sugar ORM config a un nuevo número (digamos N ) de tal manera que sea mayor que la versión actual O cambie 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;

CREAR TABLA MESSAGE_REQUEST_ID_MODEL (ID INTEGER TECLA PRIMARIA AUTOINCREMENT, MESSAGE_REQUEST_ID CHAR (128));

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

Notas adicionales

  • Esta sección del manual de Sugar ORM es la inspiración detrás de esta solución (aunque no sea correcta): 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

Tu problema puede ser 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; } }

Por favor vuelva a verificar con mi código.