Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android SQLite ORDER BY no funciona

Tengo una situación muy básica:

Tengo una mesa con alrededor de 5k filas:

CREATE TABLE "words" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , "name" TEXT NOT NULL , "def" TEXT NOT NULL, "rand" INTEGER) 

Que periódicamente actualizo usando "UPDATE palabras SET rand = random ()"

En android, cuando creo un cursor usando rawQuery () utilizando lo siguiente:

 SELECT w.id, w.name, w.def, w.rand FROM words w ORDER BY w.rand ASC; 

El cursor devuelto no itera en el orden correcto. Por ejemplo, saldrá columnas con valores rand en el siguiente orden:

 -1298882092 -2138143484 -1115732861 118839193 ... 

¿Alguien sabe lo que está pasando aquí? ¿No debería funcionar? Si ejecuto exactamente la misma consulta en SQLiteManager, devuelve los resultados en el orden correcto, por lo que esto parece ser específico de android / cursor.

ACTUALIZAR:

Aquí está el código en android, he intentado varias maneras:

Intento 1:

 Cursor cursor = db.rawQuery("SELECT w.id, w.name, w.def, w.rand FROM words w ORDER BY w.rand ASC", new String[]{}); 

Intento 2:

 Cursor cursor = db.query("words", new String[]{"id", "name", "def", "rand"}, null, null, null, null, "rand ASC"); 

En ambos casos iterar como el siguiente:

 while(cursor.moveToNext()) { ... Log.i("Test", cursor.getInt(3)); ... } 

  • SQLiteDatabase.insert () devuelve rowid incorrecto para tablas virtuales
  • Android SQLiteConstraintException: código de error 19: error de restricción
  • Cómo utilizar un script para consultar la base de datos android sqlite
  • Shell de salida Android de sqlite
  • Android: La ventana del cursor está llena
  • ¿Cuál es el modo de subprocesamiento predeterminado de SQLite en Android?
  • Android sqlite - selecciona registros donde el campo es nulo o vacío
  • Inspeccionar la base de datos android de sql desde Eclipse
  • 2 Solutions collect form web for “Android SQLite ORDER BY no funciona”

    Lo solucioné, fue una simple supervisión. La función random () devuelve un valor que puede ser mayor que un tipo de datos java int. Esto producía desbordamiento. Cambiado a getLong () y todo funciona bien. El cursor estaba iterando correctamente todo el tiempo.

    Tuve un problema con el cursor de Android, rawquery y el grupo de. El resultado no fue ordenado.

    Esta es la tabla:

     public static final String I_ID = "iid"; public static final String I_QID = "qid"; public static final String I_STATUS = "status"; public static final String I_PDATE = "pub_date"; public static final String I_TYPE = "tipo"; public static final String I_TITLE = "titolo"; public static final String I_LINK = "link"; public static final String I_QR = "qrcode"; public static final String I_DESC = "descrizione"; private static final String C_ITEM_T = "CREATE TABLE \""+T_ITEM+"\" ("+ "\""+I_ID+"\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+ "\""+I_QID+"\" INTEGER NOT NULL REFERENCES "+T_QUERY+"("+Q_ID+") ,"+ "\""+I_STATUS+"\" INTEGER NOT NULL,"+ "\""+I_PDATE+"\" TEXT NOT NULL,"+ "\""+I_TYPE+"\" TEXT NOT NULL,"+ "\""+I_TITLE+"\" TEXT NOT NULL,"+ "\""+I_LINK+"\" TEXT UNIQUE NOT NULL,"+ "\""+I_QR+"\" TEXT UNIQUE NOT NULL,"+ "\""+I_DESC+"\" TEXT"+ ");"; public static final String A_ID = "aid"; public static final String A_IID = "iid"; public static final String A_SIZE = "grandezza"; public static final String A_DURATION = "durata"; public static final String A_CHANNELS = "canali"; public static final String A_RATE = "sampleRate"; public static final String A_TORRENT = "torrent"; public static final String A_DOWNLOAD = "download"; public static final String A_LICENSE_URL = "licenza_url"; public static final String A_TAGS = "tags"; public static final String A_CREATOR = "creatore"; private static final String C_ATTR_T = "CREATE TABLE \""+T_ATTR+"\" ("+ "\""+A_ID+"\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+ "\""+A_IID+"\" INTEGER NOT NULL REFERENCES "+T_ITEM+"("+I_ID+") ,"+ "\""+A_SIZE+"\" LONG NOT NULL,"+ "\""+A_DURATION+"\" LONG NOT NULL,"+ "\""+A_CHANNELS+"\" TEXT NOT NULL,"+ "\""+A_RATE+"\" TEXT NOT NULL,"+ "\""+A_TORRENT+"\" TEXT NOT NULL,"+ "\""+A_DOWNLOAD+"\" TEXT NOT NULL,"+ "\""+A_LICENSE_URL+"\"TEXT,"+ "\""+A_TAGS+"\" TEXT,"+ "\""+A_CREATOR+"\" TEXT,"+ "UNIQUE ("+A_ID+","+A_IID+")"+ ");"; 

    Y esta era mi pregunta:

     public static final String FILL_GRID = "SELECT * "+ "FROM "+ Db.T_ITEM + " i " + "LEFT OUTER JOIN "+Db.T_ATTR+" a ON ( i."+Db.I_ID+"=a."+Db.A_IID+ ")"+ " WHERE i."+Db.I_QID+" = ? AND i."+Db.I_STATUS+" <> "+Db.STATUS_DELETED + " GROUP BY ? "; 

    Y aquí cómo lo uso:

     Cursor c = db.rawQuery(FILL_GRID, new String[]{String.valueOf(qid), order}); 

    Donde estoy seguro de que qid es un entero, y el orden i.titolo ASC o DESC

    La única solución que funcionó para mí es modificar la consulta moviendo el grupo por clausole en el método de llamada rawquery:

     public static final String FILL_GRID = "SELECT * "+ "FROM "+ Db.T_ITEM + " i " + "LEFT OUTER JOIN "+Db.T_ATTR+" a ON ( i."+Db.I_ID+"=a."+Db.A_IID+ ")"+ " WHERE i."+Db.I_QID+" = ? AND i."+Db.I_STATUS+" <> "+Db.STATUS_DELETED; Cursor c = db.rawQuery(FILL_GRID + " ORDER BY " + order, new String[]{String.valueOf(qid)}); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.