PDA

Ver la Versión Completa : Sqlite embebido en Tasker. Alguien ha podido hacerlo funcionar?


cace0353
08/01/17, 17:48:37
Pues eso, he probado con consultas simples a varias bases de datos con distintas opciones y no he logrado nada!

Por otra parte el botón de ayuda no dice nada al respecto porqué seguramente Pent aún no actualizado el fichero de ayudas…

Sería de gran utilidad porque podríamos usar tareas de Tasker con consultas Sqlite sin necesidad de rotear el movil…

Enviat des del meu Nexus 5 usant Tapatalk

GraphicAdventure
08/01/17, 19:48:47
Te refieres a la acción SQL Query?
No la probé pero seguro que funciona.
Intenta algo simple como un evento de calendario.
Recuerda que la ayuda solo se actualiza en inglés prácticamente.
O cambias el idioma a inglés en las preferencias un momento con "Always View Help Online" o mira en la web.

Rsc
08/01/17, 20:27:57
Digamos que el modo de consulta para que no requiera acceso root, es "URI formatted"

Por ejemplo, para acceder a la DB de los contactos, pongo en URI lo siguiente;

content://com.android.contacts/contacts

En el resto de apartados;

Columns, escribe la columna que quieras obtener. Puedes poner varias separadas por comas.

Selection, basándote en el lenguaje nativo de sql, escribe lo que quieres que coincida con la comuna selecciona, para obtener únicamente los que cumplan esa condición.

Selection Parameters Ni idea.

Orden by, como su nombre indica, ordenar por.. indica la comuna que quieras que establezca el orden.

Output column divider, en caso de que quieras obtener varias columnas, indica el separador que quieres que se muestre. Por defecto es una coma.

El resto de Modos, no los controlo.


Sería de gran utilidad porque podríamos usar tareas de Tasker con consultas Sqlite sin necesidad de rotear el movil…

Si y no. Para acceder a la base de datos de los contactos, calendario y "creo" cualquier base de datos que no dependan de terceras app, no hará falta root, para el resto se supone que si.

El problema, es que no se extrapolar lo que indico en el apartado URI, a otras bases de datos, ya que no es exactamente la ruta, como se indica cuando escribimos código sql.

Un saludo.

cace0353
08/01/17, 20:33:19
Muchas gracias a ambos!
El uso es para Bd propias, por tanto no necesitaré que el dispositivo receptor tenga root…

Mañana me entretendré un rato a ver si lo consigo.

Gracias de nuevo compañeros!

Enviat des del meu Nexus 5 usant Tapatalk

Rsc
08/01/17, 20:40:03
De nada, y el que entienda la relación de lo que se pone en URI, con la ruta de la base de datos, si tiene un hueco que lo explique. Que lo consulte en el hilo de la beta de Tasker, pero Pent se hizo el sueco

danko9696
08/01/17, 22:21:58
Sería de gran utilidad porque podríamos usar tareas de Tasker con consultas Sqlite sin necesidad de rotear el movil…
Tal como lo entiendo no necesitas root para realizar consultas sqlite (no bases de datos de apps sino creadas por ti, como si de cualquier otro tipo de archivo se tratase), pero para acceder a datos de otras apps sí (o sea, en la mayoría de casos). No es cosa de Tasker sino de permisos. Imagina que cualquier app pudiese acceder a los datos de cualquier otra app (base de datos u otro tipo de datos) sin ser root.

Si y no. Para acceder a la base de datos de los contactos, calendario y "creo" cualquier base de datos que no dependan de terceras app, no hará falta root, para el resto se supone que si.
La cuestión no es que dependan o no de terceras apps sino que calendario y contactos tienen permisos específicos. Para el resto de casos que no sean archivos de usuario debería hacer falta root.


No lo he probado pero respecto al nuevo sistema pensaba que permitiría usar consultas a pelo en lugar de desglosarlo en parámetros, lo que creo que puede dificultar bastante o hacer imposible consultas complejas. Mucho mejor el sistema de siempre mientras siga funcionando.

Rsc
08/01/17, 22:38:07
He encontrado esta información, pero sigo sin tener ni idea de como obtener la URI de una base de datos que creemos nosotros mismos.

Normalmente la estructura de una URI de contenido está dividida en tres partes significativas como se ve en el siguiente ejemplo:
URI de contenido para los contactos de Android

Esquema: La cadena “content://” es una constante para establecer que el origen de datos vendrá de un Content Provider.
autoridad: Es una cadena única que identifica al Content Provider para su uso. Cuando creas tus propios Content Providers normalmente se recomienda usar el nombre del paquete al que pertenece para diferenciarlos de los demas.
ruta: Es un conjunto de segmentos separados por barras oblicuas (‘/’) que guían al Content Resolver hacia la ubicación lógica de los datos dentro del Content Provider.
id: Identificador numérico (en la mayoría de los casos es la llave primaria) asociado a un solo registro que se encuentra en la ruta establecida del Content Provider. Es muy útil cuando deseamos acceder a una sola fila.
Como ves, el uso de URIs de contenido te facilita todo el trabajo a la hora de acceder a la información de otras aplicaciones, evitándonos el desarrollo de mecanismos complejos.

Esta es la razón por la cual se le denomina Resolutor de Contenido a este objeto, ya que es el encargado de parsear la URI y darse a la búsqueda de la información. ¡Una grandiosa labor!


Página con la información completa aquí:

http://www.hermosaprogramacion.com/2014/11/acceder-los-contactos-de-android/

GraphicAdventure
08/01/17, 23:14:11
https://developer.android.com/guide/topics/providers/content-provider-creating.html#ContentURI

Por lo que leo aquí para una base de datos tuya el URI será el nombre del paquete/"tabla o archivo" sin extensión.
En el archivo AndroidManifest.xml registras tu proveedor de contenido.


Selection Parameters Ni idea.
Entiendo que esto es lo que quieres buscar: nombre, teléfono, ...

cace0353
09/01/17, 10:56:37
Parece que se ha destapado el tarro de las esencias...

Pero esto ha subido mucho de nivel y ahí me quedo fuera, no llego, lo siento.

Yo sólo pretendia hacer consultas a bases de datos propias, o fabricadas a partir de tablas de Excel, desde mis tareas echando mano de la velocidad que, para estos menesteres, nos da Sqlite.

Un caso concreto:

Para obtener los códigos INE a partir del código postal (para luego sacar la previsión metereológica de la web de Aemet) uso una base de datos "CODIS_METEO.db" con una sola tabla "CODIS" con dos columnas: una con los códigos postales (columna "POSTAL") y la otra con el correspondiente código INE (columna "CODI").

Ahora lo hago con una acción Ejecutar Consola: Sqlite3 CODIS_METEO.db "SELECT CODI FROM CODIS WKERE POSTAL LIKE '%postal' " y funciona divinamente...

Pero esto obliga a tener Sqlite3 instalado en System>Xbin... y para llegar ahí hay que se usuario root!

La consulta con la acción SQL Query la planteo en el modo Raw:
como archivo pongo: CODIS_METEO.db
en Consulta : SELECT CODI FROM CODIS WKERE POSTAL LIKE '%postal'
Selection parameters:
Output column divider:
Matriz de variables: %codine
Usan Root: desactivado

La consulta me devuelve %codine (el literal) sea cual sea el valor que haya dado a %postal (naturalmente he usado valores conocidos de CP...)

Que hago mal?

danko9696
09/01/17, 11:55:42
Pero esto obliga a tener Sqlite3 instalado en System>Xbin... y para llegar ahí hay que se usuario root!
No he probado porque para lo que yo necesitaba (acceder a datos de apps) era imprescindible root sí o sí, pero si no me equivoco puedes tener sqlite en cualquier sitio, solo que si no está en xbin entonces debes indicar siempre la ruta completa, similar al uso de path en msdos. De hecho, cuando estaba con el problema de ejecutarlo en 64 bit una de las posibilidades era usar el sqlite propio de Titanium Backup, usando la ruta especifica hasta él.

cace0353
09/01/17, 13:31:54
No he probado porque para lo que yo necesitaba (acceder a datos de apps) era imprescindible root sí o sí, pero si no me equivoco puedes tener sqlite en cualquier sitio, solo que si no está en xbin entonces debes indicar siempre la ruta completa, similar al uso de path en msdos.

Lo siento, he probado copiando Sqlite3 a la carpeta de Tasker y poniendo en Ejecutar consola:

/sdcard/Tasker/sqlite3 nombre de la base de datos "consulta" y no me ha funcionado...

De hecho, cuando estaba con el problema de ejecutarlo en 64 bit una de las posibilidades era usar el sqlite propio de Titanium Backup, usando la ruta especifica hasta él.

Yo, ahora mismo, estoy usando el Sqlite3 de Titanium Backup copiado a la carpeta System/Xbin/ funcionando perfectamente, pero también debes tener root...

Creo que lo más simple para que la tarea rule sin root va a ser prescindir de Sqlite y resolverlo exportando la BD a un CSV y mediante un "Leer Archivo" y 2 "Separar variable" extraer el código INE. No será tan rápido pero sí mas sencillo...

Gracias por vuestro interés de todos modos. Seguiré el hilo para intentar aprender y subir otro peldaño...

GraphicAdventure
09/01/17, 20:28:36
En la acción SQL Query tienes 3 modos, el Raw es usar Sqlite puro.
Intenta el Formatted e indica la ruta completa del archivo /storage/sdcard0/tucarpeta/codis_meteo.db
Pon la tabla, columna y matriz de variables (array) para ver si sin especificar datos funciona.
Prueba en la tarjeta interna sin root y con root.

cace0353
09/01/17, 21:48:26
Gracias por tú interés GraphicAdventure,
He probado el modo "formatted" indicando la ruta /storage/emulated/0/Tasker/CODIS_METEO.db y sigue devolviendo la variable vacia.

Curiosamente Tasker, una vez ejecutada la tarea, corrige la ruta acortándola á Tasker/XODIS_METEO.db

Probado con root, sin root, con filtros y sin filtros… siempre devuelve solamente el nombre de la variable de salida %codine

Por cierto, mi Nexus 5 sólo tiene SD interna.

Enviat des del meu Nexus 5 usant Tapatalk

GraphicAdventure
09/01/17, 21:58:37
siempre devuelve solamente el nombre de la variable de salida %codine


Devuelve un array, ¿miraste %codline()?

cace0353
09/01/17, 22:07:09
J..er! es verdad!. Estaba acostumbrado a que devolviera la salida como una variable y luego separar por el salto de linea…

Ahora probaré con filtros…

Gracias mil!

PD: Correcto, también con filtros y teniendo en cuenta que devuelve un array. Aquí estaba el error, no funciona como sqlite puro…!

Enviat des del meu Nexus 5 usant Tapatalk

Rsc
25/01/17, 22:11:57
Correcto, también con filtros y teniendo en cuenta que devuelve un array. Aquí estaba el error, no funciona como sqlite puro…!


Buenas cace0353, entiendo que lo has conseguido solo ejecutando la acción como root, no? Es que yo no consigo hacer funcionar las consultas sql sin root, ni aunque cree la base de datos en la raiz de mi sd.

Un saludo.

cace0353
26/01/17, 09:17:30
Buenas cace0353, entiendo que lo has conseguido solo ejecutando la acción como root, no? Es que yo no consigo hacer funcionar las consultas sql sin root, ni aunque cree la base de datos en la raiz de mi sd. Un saludo.

Hola @Rsc (http://www.htcmania.com/member.php?u=531046)

No, colega, funciona sin root! Recuerda que desde el principio, cuando abrí el post, la idea era poder ejecutar consultas Sqlite a bases de datos propias sin usar root, para prescindir del roteo en el dispositivo receptor...

De momento solo lo he aplicado en un proyecto. Tengo en una base de datos una tabla CODIS con 14.690 registros y solo dos columnas: POSTAL y CODI. Para cada código postal hay un código INE que és el que utilizo poara consultar la prevision metereológica en la web de AEMET.
Con un solo WHERE poniendo en Selection el nombre de la columna y el valor de la variable que debia buscar asi:

Modo: Formatted
Archivo: CODIS_METEO.db (está en la raiz de la Sdcard...)
Table: CODIS (el nombre de la tabla donde se realizará la búsqueda)
Columns: CODI (la columna que contiene los datos de salida...)
Selection: POSTAL = %codi_postal (este és el WHERE, siendo POSTAL el nombre de la columna y %codi_postal el nombre de la variable que debia buscar
Selection parameters:
Order By:
Output Column Divider:
Matriz de Variables: %codi_ine (esta és la matriz que recoge los datos de salida de la consulta...)
Usar Root:

El problema que tenia és que la consulta en este modo directo devuelve una matriz (array) ya formada. En cambio Sqlite puro devuelve una variable con los resultados hallados separados por lineas. Luego con una acción "Separar Variable" con el salto de línea me "fabricaba" la matriz.

fus
26/01/17, 10:05:27
Justo antes de ayer estuve mirando la api de aemet, y salí loco con los codigos INE. Mi idea era hacer un perfil que según tu ubicación, te de el tiempo. Y al final me busqué los datos de otra página, openweathermap.org, que tiene modalidad gratis también, y puedes hacer consultas por latitud y longitud, sin tener que andar liado con codigos INE de esos

Rsc
26/01/17, 12:58:54
cace0353 cojonudo, funciona! Me había cerrado en banda, con el modo URI Formatted, que es el que me funcionaba para los contactos, y como ya comenté, los otros modos, como en este caso "Formatted" , no los controlaba.

Me va a venir muy bien, porque estaba haciendo una app, para mí y unos amigos, para una liga que estamos haciendo de un juego de fútbol, y al ver que no conseguía hacer una tabla SQL, estaba metiendo los datos en un archivo.txt, para luego extraer lo que me interesase con el comando grep... Bueno, un follon en general, esto me va a facilitar muchísimo la labor.

Lo dicho, gracias y un saludo.

Edito: Una cosa mas, para meter datos en la tabla, se puede hacer con el método nativo de SQL?

cace0353
26/01/17, 13:10:07
Claro, la Bd la puedes usar sea qual sea el método usado para crearla…

Me alegra que te haya funcionado, colega!

Enviat des del meu Nexus 5 usant Tapatalk

Rsc
26/01/17, 15:45:21
Claro, la Bd la puedes usar sea qual sea el método usado para crearla…

El problema es que no me deja trabajar con SQL desde la línea de comandos, tal y como lo hacía en el teléfono que tenía rooteado, aunque se trate de una base de datos ubicada en la SD.

Me hago un poco de lío con éste tema, pero supongo que para trabajar con sql, requiere haber instalado previamente busybox, no estoy seguro. El caso es que trabajando con la base de datos desde la acción recientemente implementada SQL Query, si me deja trabajar, pero desde ahí no se insertar datos en la tabla.

Saludos.

cace0353
26/01/17, 17:10:35
Bueno Rsc, en el caso en el que he usado esta acción sólo hacía consultas, es una base de datos cerrada…

Ignoro como usar los parámetros DELETE, UPDATE y INSERT con la acción Sql embebida. Será cuestión de probar…

Cuando lo consigas (tú u otro forero), por favor, compartidlo, para esto es el foro!

Enviat des del meu SM-T550 usant Tapatalk

cace0353
26/01/17, 17:59:44
Edito: Una cosa mas, para meter datos en la tabla, se puede hacer con el método nativo de SQL?

Ya está...

Lo he conseguido con el método "Raw" así:

Primero defines los valores de las variables que vamos a insertar (%val_col1, %val_col2, %val_col3, etc) en las columnas (COL_1, COL_2, COL_3, etc.) de la tabla MI_TABLA de nuestra base de datos MI_BASE.db

Parámetros de la acción SQL Query:

Modo: Raw
Archivo: MI_BASE.db
Consulta: INSERT INTO MI_TABLA (COL_1,COL_2,COL_3) VALUES (%val_col1,%val_col2,%val_col3)
Selection Parameters:
Output Column Divider:
Matriz de Variables (array): %resultado (pon lo que quieras ya que no es una consulta y, por tanto, no hay salida; pero debes poner algun nombre para el array...)
Usar Root: (no)

Rsc
26/01/17, 18:53:01
Lo he conseguido con el método "Raw" así:

Eres un crack, gracias a ti vamos a poder tener una app en condiciones para llevar la contabilidad de goles y tarjetas en nuestra liga del Pro Evolutión. Si no estuvieras tan lejos te invitaría a una cerveza :risitas:

Solo puntualizar una cosa, por si alguien lo intenta y no le funciona; En el apartado consulta , lo que sea texto hay que escribirlo entre comillas "texto"

En mi caso:

Consulta: INSERT INTO goles ("goles","player","usuario") VALUE (15,"Messi","Raúl")

Para muchos será obvio, pero para otros, que mi incluyo, un detalle como este puede suponer dos días de google y acostandome a las 3 de la mañana X-D Saludos.