SQLite Android Inner Join
Tengo un extraño problema. Estoy buscando datos del servidor e insertándolo en tablas. Después de la inserción de la consulta que los datos mediante la unión interna entre dos tablas. Aquí está mi consulta:
Select F._id, F.id, F.logo, F.total_like, F.distance, F.store_name, F.mob_no_1, F.mob_no_2, F.mob_no_3, F.tel_no_1, F.tel_no_2, F.tel_no_3, F.description, R.total_record, R.total_page, R.current_page from FAVOURITE_STORES as F INNER JOIN FAVOURITE_RECORDS as R on F.area_id = R.area_id where F.area_id = 2 and R.area_id = 2
Consigo que el cursor cuente como 1 en algunos dispositivos y en algunos dispositivos consigo el contador del cursor como cero. Incluso si los datos están allí en la tabla.
- ¿Por qué insertWithOnConflict (..., CONFLICT_IGNORE) devuelve -1 (error)?
- Causado por: android.database.sqlite.SQLiteException: no hay tal tabla: (código 1) Android
- Cómo mejorar el rendimiento de la base de datos SQLite para android
- Android - Base de datos pre-poblada, insertada o pre-cargada?
- Obtener el valor de campo con un cursor
Aquí está mi función de consulta seleccionada
public Cursor rawQuery(String sQuery,String[] selectionArgs) { if(mDatabase == null) { mDatabase = getWritableDatabase(); } debug("Query "+sQuery); return mDatabase.rawQuery(sQuery,selectionArgs); }
Clase del cursor
public class ExampleCursorLoader extends CursorLoader { private Activity mActivity; private String msQuery; private DBUtil mDbUtil; private String[] mSelectionArgs; public ExampleCursorLoader(Activity context, String query,String[] selectionArgs) { super(context); this.mActivity = context; this.msQuery = query; this.mSelectionArgs = selectionArgs; this.mDbUtil = DBUtil.getInstance(mActivity.getApplicationContext()); } public ExampleCursorLoader(Activity context, String query) { this(context,query,null); debug(query); } public Cursor loadInBackground() { debug("Loading in Background"); Cursor cursor=null; cursor = mDbUtil.rawQuery(msQuery,mSelectionArgs); return cursor; } private void debug(String s) { Log.v("Adapter " , "Adapter " + s); } protected void onStartLoading() { forceLoad(); debug("Started Loading"); } protected void onStopLoading() { super.onStopLoading(); } }
Y así es como lo llamo.
return new ExampleCursorLoader(mActivity,sQuery);
El dispositivo que da cuenta como 1 es Samsung s3. Y cero es Samsung Grand. ¿Tiene algún pensamiento o sugerencia sobre esto?
- Cerrar () nunca se llamó explícitamente en base de datos incluso después de implementar close ()
- La base de datos SQLite no aparece en el Explorador de archivos
- ¿Cuándo se llama a OnUpgrade y cómo se obtiene el parámetro oldVersion?
- Varias excepciones al trabajar con bases de datos SQLite
- Chmod falló: EPERM (operación no permitida) en android?
- Ormlite SQLiteCursor: cierre el cursor en null dos veces o más
- Inserción de entradas múltiples en la base de datos SQLite android
- Android.database.sqlite.SQLiteCantOpenDatabaseException: error desconocido (código 14): No se pudo abrir la base de datos
El dispositivo que da cuenta como 1 es Samsung s3. Y cero es Samsung Grand. ¿Tiene algún pensamiento o sugerencia sobre esto?
Este tipo de problema es difícil de explicar porque lo más probable es que no arroje ningún error, pero sólo muestra resultados diferentes y no deseados.
Todo lo que puedes hacer es "mejorar la consulta" :
En primer lugar utilice marcadores de posición y no declaraciones en bruto:
String query = "... where F.area_id = ? and R.area_id = ?"; String[] whereArgs = {"2", "2"};
Además, no es necesario usar la cláusula AS
, basta con decir:
... from FAVOURITE_STORES F INNER JOIN FAVOURITE_RECORDS R on ...
De código que proporcionó everythings parece correcto (consulta y un uso de rawQuery ()).
Me parece que la última sección de su cláusula WHERE es innecesaria:
and R.area_id=2
Ya ha especificado las filas de la tabla FAVOURITE_STORES para que coincida con id_arquitectura = 2. Como se realiza INNER JOIN en esa columna, sólo devolverá las filas de FAVOURITE_RECORDS donde la columna area_id coincide con la columna area_id de FAVOURITE_STORES.
No estoy seguro de cómo el motor SQLite maneja esto, pero vale la pena intentarlo.
- ¿Cómo mostrar caracteres Emoji de estilo iOS en el EditText de Android?
- AlignParentBottom + marginBottom no trabajando juntos