martes, 16 de julio de 2013

Consultar la base de datos offline en iOS

Hace unos días se liberó la versión Beta 1 de GeneXus Tilo, que tiene como una de sus características principales la posibilidad de generar aplicaciones Offline para Smart Devices.

Algo que puede resultar útil, sobre todo cuando estamos diagnosticando algún problema, es poder consultar directamente la base de datos.

En iOS no es algo evidente como hacer esto, por lo que lo dejo escrito acá por si alguien lo precisa. Esto sirve para el Simulator, no en un dispositivo...

Lo primero que debemos hacer es obtener la ruta al archivo SQLite. Para eso, debemos ejecutar la aplicación desde Xcode en el Simualtor. Debemos ejecutarla desde Xcode y no desde GeneXus, para así tener la opción de hacer debug.

Ponemos un breakpoint en algún punto por el que sepamos que va a pasar la aplicación (puede ser un procedure o el data provider asociado a un panel), y cuando se detiene, en la consola, escribimos:
po [[GXDBManager sharedInstance] databasePath]
Ese comando nos va a dar la ruta donde está el archivo SQLite con la base de datos, va a ser algo de la forma:
$0 = 0x0c871630 /Users/mcrispino/Library/Application Support/iPhone Simulator/6.1/Applications/1030E975-21FE-4C3F-8D4C-4836D8C34CEF/Documents/CM_Ios.sqlite
pero con otra ruta evidentemente, ya que depende de la aplicación.

Copiamos la ruta completa, desde el "/Users" hasta el ".sqlite" inclusive, abrimos la aplicación Terminal.app, y ahí escribimos
sqlite3 "<ruta_completa>"
donde <ruta_completa> es la ruta copiada en el punto anterior. Las comillas son importantes, porque la ruta puede tener espacios en blanco.

Una vez hecho esto, vamos a estar en la consola de SQLite, en la base de datos de nuestra aplicación. Ahí podemos hacer consultas SQL como lo haríamos normalmente en cualquier otro DBMS (respetando la sintaxis de SQLite, por supuesto). Por ejemplo:
select * from Products;
Para terminar, un par de comandos útiles:
.tables, lista las tablas que hay en la base de datos
.exit, sale de la consola de SQLite :)