¿Cómo lograr límite de palabras en Sqlite Android?
Me gustaría lograr lo siguiente (una búsqueda de texto completo),
SELECT * FROM tablename where columnname REGEXP '[[:<:]]some string[[:>:]]'
Cuando estoy interesado en sólo cadenas exactas (no sólo palabras) de una columna de texto completo.
- Cierre del cursor en onPostExecute no produce nada
- Base de datos H2 vs SQLite en Android
- SQLiteQueryBuilder.query () vs SQLiteDatabase.query ()
- Android sqlite delete no elimina realmente las filas
- ¿Cómo migrar la aplicación SQLite existente a la biblioteca de persistencia de habitaciones?
He estado usando el SQL exacto arriba en MySQL y ahora migrar la mayor parte del código a las aplicaciones de Android.
Pero he estado buscando en varios puestos donde se menciona que REGEXP no es compatible con Android Sqlite (por ejemplo: link1 , link2 , link3 ).
¿Hay alguna forma de habilitar REGEXP en Android?
Si no hay alternativas para el SQL anterior?
Gracias,
EDIT: Actualmente estoy recibiendo la siguiente excepción al usar REGEXP en Android,
android.database.sqlite.SQLiteException: no such function: REGEXP (code 1):...
Entiendo que podemos hacer uso de GLOB y LIKE (o puede ser incluso MATCH). ¿Cómo se puede columnname REGEXP '[[:<:]]somestring[[:>:]]'
para usar GLOB
y / o LIKE
y / o MATCH
?
SOLUCIÓN 1 : Con @cybersam la ayuda que sigue es lo que estoy usando (después de algunas modificaciones)
SELECT * FROM tablename where (columnname GLOB '*some string*' OR columnname GLOB '*Some string*') AND ( ( (columnname GLOB '*[^a-zA-Z0-9_]some string[^a-zA-Z0-9_]*' AND columnname GLOB '*some string[^a-zA-Z0-9_]*' AND columnname GLOB '*[^a-zA-Z0-9_]some string*') OR (columnname GLOB '*[^a-zA-Z0-9_]Some string[^a-zA-Z0-9_]*' AND columnname GLOB '*Some string[^a-zA-Z0-9_]*' AND columnname GLOB '*[^a-zA-Z0-9_]Some string*') ) )
GLOB
mayúsculas y minúsculas, por lo que tengo un OR
adicional
La segunda solución de @cybersam es mucho más rápida en mi caso.
SOLUCIÓN 2 : Para manejar el caso en-sensibilidad
SELECT * FROM tablename where (columnname GLOB '*[sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG]*') AND ( ( columnname GLOB '*[^a-zA-Z0-9_][sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG][^a-zA-Z0-9_]*' AND columnname GLOB '*[sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG][^a-zA-Z0-9_]*' AND columnname GLOB '*[^a-zA-Z0-9_][sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG]*') )
- Consulta SQLite de Android y uso del cursor para tratar varias filas
- Obtener id generado después de insertar
- Archivo está encriptado o no es una base de datos (excepción net.sqlcipher.database.SQLiteException)
- Android rawQuery - ¿Hay una manera de usar "IN" parametrizada para una colección de datos
- Cómo escribir una base de datos en un archivo de texto en android
- Entender el campo de incremento automático de Android de sqlite
- Cómo personalizar FTS tokenizer en Android
- Esquema de etiqueta para una aplicación de Android
One Solution collect form web for “¿Cómo lograr límite de palabras en Sqlite Android?”
Para apoyar realmente REGEXP
, usted tendrá que agregar su propia función del usuario de regexp () .
Este enlace puede ayudarte a averiguar cómo crear funciones definidas por el usuario, en general, para Android, pero no es sencillo.
Si sus patrones son muy simples, el operador GLOB podría ser lo suficientemente bueno.
Por ejemplo, para realizar una búsqueda equivalente a esta consulta MYSQL:
SELECT * FROM tablename where columnname REGEXP '[[:<:]]some string[[:>:]]'
Puede probar esto en SQLite:
SELECT * FROM tablename where columnname GLOB '[^a-zA-Z0-9_]some string[^a-zA-Z0-9_]' OR columnname GLOB 'some string[^a-zA-Z0-9_]' OR columnname GLOB '[^a-zA-Z0-9_]some string' OR columnname GLOB 'some string';
La consulta anterior utiliza el hecho de que en MYSQL, un carácter de palabra se define como un carácter alfanumérico o un guión bajo. Los términos OR
adicionales se necesitan para igualar también los casos en los que no hay texto en ninguno (o ambos) lados de some string
.
Finalmente, si 'alguna cadena' es relativamente rara en columnname
, entonces la siguiente consulta más larga puede ser realmente más rápida, ya que sólo hará múltiples evaluaciones GLOB
para una minoría de valores:
SELECT * FROM tablename where columnname GLOB '*some string*' AND ( columnname GLOB '[^a-zA-Z0-9_]some string[^a-zA-Z0-9_]' OR columnname GLOB 'some string[^a-zA-Z0-9_]' OR columnname GLOB '[^a-zA-Z0-9_]some string' OR columnname GLOB 'some string');
- Espresso – typeText () no funciona correclty, a veces faltan letras
- ¿Existe una herramienta para eliminar las variables no deseadas, no utilizadas