Android SQLite ORDER BY не работает - PullRequest
7 голосов
/ 30 января 2011

У меня очень простая ситуация:

У меня есть таблица с 5k строками:

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

, которую я периодически обновляю, используя "UPDATE words SET rand = random ()"

В Android, когда я создаю курсор, используя rawQuery (), используя следующее:

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

Возвращенный курсор не повторяется в правильном порядке.Например, он будет выводить столбцы со значениями rand в следующем порядке:

-1298882092
-2138143484
-1115732861
118839193
...

Кто-нибудь знает, что здесь происходит?Разве это не должно работать?Если я выполняю точно такой же запрос в SQLiteManager, он возвращает результаты в правильном порядке, так что, похоже, это зависит от Android / курсора.

ОБНОВЛЕНИЕ:

Вот код в Android, япробовал несколько способов:

Попытка 1:

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

Попытка 2:

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

В обоих случаях я повторяю, как показано ниже:

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

Ответы [ 2 ]

6 голосов
/ 31 января 2011

Я решил это, был простой недосмотр.Функция random () возвращает значение, которое может быть больше, чем тип данных java int.Это производило переполнение.Перешел на getLong () и все работает нормально.Курсор правильно итерировал все время.

1 голос
/ 15 июня 2012

У меня была проблема с курсором Android, rawquery и группировки по. Результат не был заказан.

Это таблица:

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+")"+
        ");";

И это был мой запрос:

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 ? ";

и вот как я это использую:

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

Где я уверен, что qid является целым числом, и закажите i.titolo ASC или DESC

Единственный обходной путь, который мне помог, - это изменить запрос, перемещая группу по клаве в методе вызова 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)});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...