0

你好堆栈溢出:D

我正在构建一个带有需要某种排序的列表视图的 android 应用程序,因为它可以重新洗牌。所以我的数据库中有一个排序列,它保存数据库中每个值的位置。现在,每当我在列表中创建一个新元素时,我希望它的排序值为maximum+1,因此它将位于列表的末尾。问题是,我不知道如何编写将返回一个值的原始查询,并检查它以确保完全检索到一个值(数据库可能为空)。

到目前为止我的努力:

Cursor sortcursor = ourDatabase.rawQuery("SELECT MAX(" + KEY_SORT + ") FROM " + TABLE_CASTING + " WHERE " + KEY_USER + "='" + username + "';", null);
int maxSort = sortcursor.getInt(sortcursor.getColumnIndex(KEY_SORT));
maxSort++;
cv.put(KEY_SORT, maxSort);

谢谢你的帮助 :)

4

2 回答 2

2

在您的情况下,光标只有一列,因此您应该使用sortcursor.getInt(0)而不是sortcursor.getInt(sortcursor.getColumnIndex(KEY_SORT)). 试试下面的代码:

Cursor cursor = ourDatabase.rawQuery("SELECT MAX(" + KEY_SORT + ") FROM " + TABLE_CASTING + " WHERE " + KEY_USER + "='" + username + "';", null);
int maxSort = 0;

if (cursor != null) {
    try {
        if (cursor.moveToFirst() && !cursor.isNull(0)) {
            maxSort = cursor.getInt(0) + 1;
        }
    } finally {
        cursor.close();
    }
}

cv.put(KEY_SORT, maxSort);
于 2013-03-09T16:35:12.520 回答
1

下面将起作用,虽然请注意它是用 MYSQL 而不是 sqllite 编写的,但我假设相同的功能可用。我只是将下一个订单值插入到表中,如果表为空则返回 1,如果不是则将值增加 1。第二个子查询返回顺序,但我发现将它与插入结合起来很方便。

INSERT INTO table_name (order_column_name) 
VALUES ( 
    (SELECT CASE WHEN MAX(tn.order_column_name) IS NULL THEN 1 
     ELSE MAX(tn.order_column_name)+1 END
     AS order_column_name FROM table_name tn
     ORDER BY tn.order_column_name DESC LIMIT 1)
);
于 2013-04-09T18:00:03.180 回答