Cómo implementar la función recursiva de sqlite3 en dispositivos Android
Estoy tratando de implementar la función recursiva dentro de una aplicación para Android;
Primero, lo intento (función recursiva) de 'cmd' ventanas:
- ¿Cómo agregar dos nuevas columnas a la base de datos SQLite de Android?
- Sqlite3 tabla con límite máximo de líneas (por elección) eficiencia
- ¿Qué hace exactamente la restricción de clave externa "NO ACTION" de SQLite y cómo es diferente de "RESTRICT"?
- Eliminar varias filas de contentprovider
- El antiguo constructor de SimpleCursorAdapter desaprobó .. realmente?
Creo una tabla:
CREATE TABLE tree( id_tree integer PRIMARY KEY AUTOINCREMENT, id_boss TEXT, id_child TEXT, answ TEXT);
A continuación, inserte algunos valores:
INSERT INTO tree(id_boss,id_child,answ) VALUES('1','2','T'); INSERT INTO tree(id_boss,id_child,answ) VALUES('1','3','F'); INSERT INTO tree(id_boss,id_child,answ) VALUES('2','P1','T'); INSERT INTO tree(id_boss,id_child,answ) VALUES('2','4','F'); INSERT INTO tree(id_boss,id_child,answ) VALUES('3','P2','T'); INSERT INTO tree(id_boss,id_child,answ) VALUES('3','8','F');
Luego ejecuto una consulta recursiva que ahora está disponible para sqlite 3.8:
WITH RECURSIVE under_alice(name,level) AS ( VALUES('1','0') UNION ALL SELECT tree.id_child, under_alice.level+1 FROM tree, under_alice WHERE tree.id_boss=under_alice.name ORDER BY 2 DESC ) SELECT substr('..........',1,level*3) || name FROM under_alice;
Está funcionando muy bien con resultado:
1 ...2 ......4 ......P1 ...3 ......8 ......P2
Luego selecciono id_child donde id_boss = '1' y answ = 'T' con esta consulta;
WITH RECURSIVE under_alice(name,level) AS ( VALUES('1','0') UNION ALL SELECT tree.id_child, under_alice.level+1 FROM tree, under_alice WHERE tree.id_boss=under_alice.name and answ = 'T' and tree.id_boss='1' ORDER BY 2 DESC ) SELECT substr('..........',1,level*3) || name FROM under_alice;
Está funcionando muy bien con este resultado:
1 ...2
Todo se puede ejecutar dentro de un prompt cmd, pero cuando estoy probarlo para implementarlo en mi aplicación android, me sale un error (por ejemplo, no se puede ejecutar):
Aquí está mi código para ejecutar la consulta desde mi aplicación Android:
try { SQLiteDatabase db = dbHandler.getWritableDatabase(); String q = "WITH RECURSIVE under_alice(name,level) AS ( VALUES('1','0') UNION ALL SELECT tree.id_child, under_alice.level+1 FROM tree, under_alice WHERE tree.id_boss=under_alice.name and answ = 'T' and tree.id_boss='1' ORDER BY 2 DESC) SELECT max(name) as au FROM under_alice;"; Cursor eq = db.rawQuery(q, null); eq.moveToFirst(); int au = eq.getColumnIndex("au"); String sau = eq.getString(au); makeToast(""+sau); // if execute succes, create a toast message } catch (Exception e) { // TODO: handle exception makeToast("failed query"); // if query filed } }
¿Cómo puedo hacer que esto funcione? ¿Hay algo malo en mi consulta?
- Android: ¿Cómo acceder a una sola base de datos de múltiples actividades en la aplicación?
- Condición de consulta múltiple en Android usando ORMLITE
- Android: La ventana del cursor está llena
- Filtrar el parámetro ListView por 'selección' en CursorLoader
- ¿Cómo puedo buscar los datos de mes específico de la base de datos SQLite
- Cómo obtener nombres de columna con datos de consulta en sqlite3?
- Exportar archivo de base de datos sqlite en XML y luego en la hoja de cálculo de Excel
- La base de datos SQLite de Android está bloqueada
- ¿Qué modelos de teléfonos inteligentes de Samsung tienen período faltante para el tipo de entrada html5 = "número"?
- Compartir descriptores de archivos de memoria compartida en aplicaciones / procesos android utilizando el archivo de enlace