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:

  • Añadir elemento extra al adaptador de cursor android
  • Cursor while loop devuelve cada valor pero el último
  • No se ha podido crear la ventana del cursor desde la carpeta
  • IllegalStateException: obtiene la ranura de campo de la fila 0 col -1 falló
  • La aplicación se bloquea al iniciar Debido a java.lang.IllegalArgumentException: la columna '_id' no existe
  • SimpleCursorAdapter y CursorAdapter
  • 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)); ... } 

  • ¿Cómo insertar elementos adicionales en un SimpleCursorAdapter o Cursor para un Spinner?
  • Visualización de un cursor de la base de datos de Android
  • ¿Cómo funciona un cursor SQLite trabajar internamente?
  • Alcanzó el tamaño MAX para la caché de instrucciones compiladas-sql para la base de datos
  • Cómo obtener el valor de la base de datos en una matriz String en android (sqlite Database)
  • No se puede reanudar el error de actividad
  • 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.