Перемещение строки в sqlite (столбец Position) - PullRequest
0 голосов
/ 22 января 2020

Итак, в настоящее время я использую DragSortListView с базой данных SQLite. Я хочу прибегнуть к своей базе данных всякий раз, когда я перетаскиваю элемент ListView на новую позицию. Поэтому я написал кусок кода, который должен управлять этим. Но если я перемещаю что-то с позиции ниже на более высокую, это странным образом сортируется. Я уже часами искал этот код и спрашивал некоторых друзей, но я так и не нашел решение.

Код

Метод в DatabaseHelper

public void moveValues(int from, int to, String sammlung){
    SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
    System.out.println(from + " - " + to);
    if(from < to){
        //This part is working properly
        Cursor cursor = sqLiteDatabase.rawQuery("SELECT ID FROM " + TABLE_NAME + " WHERE POSITION IS " + "\"" + from + "\" AND SAMMLUNG IS " + "\"" + sammlung + "\"", null);
        for (int i = from+1; i < to+1; i++){
            switchPositionValue(i, i-1);
        }
        ContentValues contentValues = new ContentValues();
        contentValues.put(COLUMN_5, to);
        cursor.moveToFirst();
        sqLiteDatabase.update(TABLE_NAME, contentValues, "ID=?", new String[]{cursor.getInt(0)+""});
        cursor.close();
    }else{
        //This is the not working part
        Cursor cursor = sqLiteDatabase.rawQuery("SELECT ID FROM " + TABLE_NAME + " WHERE POSITION IS " + "\"" + from + "\" AND SAMMLUNG IS " + "\"" + sammlung + "\"", null);
        for (int i = from-1; i > to-1; i--){
            switchPositionValue(i, i+1);
        }
        ContentValues contentValues = new ContentValues();
        contentValues.put(COLUMN_5, to);
        cursor.moveToFirst();
        System.out.println(cursor.getInt(0));
        //The next line destroys it. But I dont know how to fix it or what exactly is not working
        sqLiteDatabase.update(TABLE_NAME, contentValues, "ID=?", new String[]{cursor.getInt(0)+""});
        cursor.close();
    }
}

Параметры: from: позиция, из которой он был удален: позиция, которую он занял в sammlung: я сохранил все элементы разных коллекций в одной базе данных. Так что это только там, чтобы отсортировать только определенные c элементы.

Метод для изменения значения строки с указанным c позиция

public void switchPositionValue(int before, int after){
    SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COLUMN_5, after);
    sqLiteDatabase.update(TABLE_NAME, contentValues, "POSITION=?", new String[]{before+""});
}

Демонстрация

Demonstration

Так что, если у вас есть идея, почему она ведет себя так странно, или знаете лучший подход к перемещению строки в базе данных, я был бы очень признателен за вашу помощь.

1 Ответ

1 голос
/ 22 января 2020

Android другой способ SQL один (столбец COLUMN_5 - POSITION)

public void moveValues(int from, int to) {
    SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
    String query =
            "WITH p(from_position,to_position,max_position,min_position) AS (" +
                    "SELECT " +
                    "?," +
                    "?," +
                    "(SELECT max(" + COLUMN_5 + ") FROM " + TABLE_NAME + ")," +
                    "(SELECT min(" + COLUMN_5 + ") FROM " + TABLE_NAME + ")), " +

                    "updates AS(" +
                    "SELECT " + TABLE_NAME + ".id," + COLUMN_5 + " AS current, " + COLUMN_5 + " + 1 AS proposed " +
                    "FROM " + TABLE_NAME + " " +
                    "WHERE " + COLUMN_5 + " >= (SELECT to_position FROM p) " +
                    "AND " + COLUMN_5 + " < (SELECT from_position FROM p) " +

                    "UNION SELECT " + TABLE_NAME + ".id," + COLUMN_5 + " AS current, " + COLUMN_5 + " -1 AS proposed " +
                    "FROM " + TABLE_NAME + " " +
                    "WHERE " + COLUMN_5 + " <= (SELECT to_position FROM p) " +
                    "AND " + COLUMN_5 + " > (SELECT from_position FROM p) " +

                    "UNION SELECT " + TABLE_NAME + ".id," + COLUMN_5 + ",(SELECT to_position FROM p) " +
                    "FROM " + TABLE_NAME + " " +
                    "WHERE " + COLUMN_5 + " = (SELECT from_position FROM p) " +
                    "AND (SELECT from_position FROM p) <> (SELECT to_position FROM p)" +
                    "), " +

                    "finish_updates AS (" +
                    "SELECT * FROM updates " +
                    "WHERE max((SELECT from_position FROM p),(SELECT to_position FROM p)) <= (SELECT max_position FROM p) " +
                    "AND min((SELECT from_position FROM p),(SELECT to_position FROM p)) >= (SELECT min_position FROM p)" +
                    ")" +

                    "UPDATE " + TABLE_NAME + " SET " + COLUMN_5 + " = " +
                    "(" +
                    " SELECT proposed " +
                    " FROM finish_updates " +
                    " WHERE finish_updates.id = " + TABLE_NAME + ".id" +
                    ") " +
                    "WHERE " + TABLE_NAME + ".id IN " +
                    "(" +
                    " SELECT id FROM finish_updates" +
                    ");";
    SQLiteStatement stmnt = sqLiteDatabase.compileStatement(query);
    stmnt.bindLong(1,from);
    stmnt.bindLong(2,to);
    stmnt.executeUpdateDelete();
}

проверка скрипки SQL при

...