Android SQLiteDatabase 从顶部开始

Android SQLiteDatabase at item from top

我希望所有新项目都添加到顶部,即如果 ROW-ID 1,2,3 被占用并且我添加一个新项目,它应该被添加到位置 1,其余的应该是转移。但是现在当我添加一个项目时,它被添加到 ID 4(即在后面)。

方法

Temp_Cover_StoryBaseList_DatabaseHandler db = new Temp_Cover_StoryBaseList_DatabaseHandler(context, currentUsername);
db.addStory(pointer, filePath);
db.close();

_

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) 
    {
        String CREATE_STORIES_TABLE 
                = "CREATE TABLE " + TABLE_TEMP_BASESTORY_LIST 
                + "(" 
                + KEY_ID            + " INTEGER PRIMARY KEY,"
                + KEY_POINTER       + " STRING,"
                + KEY_URI           + " STRING"
                + ")";

        db.execSQL(CREATE_STORIES_TABLE);
    }

_

    // Adding new Story
    public void addStory(String pointer, String filePath) 
    {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_POINTER,  pointer  );
        values.put(KEY_URI,      filePath );

        // Inserting Row
        long id = db.insert(TABLE_TEMP_BASESTORY_LIST, null, values);
        Log.d(TAG, "TempCover ID:" + Long.toString(id));

        db.close(); 
    }

_

public List<StoryData> getAllStories()
{
    List<StoryData> storyDataList = new ArrayList<StoryData>();

    // Select All Query
    String selectQuery = "SELECT  * FROM " + TABLE_STORIES_LIST;

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    if(cursor !=null)
    {
        if (cursor.moveToFirst()) 
        {
            do 
            {
                ArrayList<Integer> coverList = new ArrayList<Integer>();
                coverList.add( cursor.getInt(4) );
                coverList.add( cursor.getInt(5) );

                StoryData sData = new StoryData
                        (
                        cursor.getInt(0),
                        cursor.getString(1),
                        cursor.getString(2),
                        cursor.getInt(3),
                        coverList,
                        Long.parseLong(cursor.getString(6)),
                        Boolean.parseBoolean(cursor.getString(7)),
                        cursor.getString(8)
                        );

                // Adding contact to list
                storyDataList.add(sData);

            } while (cursor.moveToNext());
        }
    }


    return storyDataList;
}

您似乎正在尝试更改 SQL 行的自动增量 ID。这是在您创建新行时自动设置的。您不能或至少不应该设置自动增量 ID 或取决于 table.

中行的物理顺序

最好创建一个单独的列,将所需的行顺序包含为整数。然后,当您查询 table 时,您可以根据该列中的整数对行进行排序。

您可以添加如下所示的列:

@Override
    public void onCreate(SQLiteDatabase db) 
    {
        String CREATE_STORIES_TABLE 
                = "CREATE TABLE " + TABLE_TEMP_BASESTORY_LIST 
                + "(" 
                + KEY_ID            + " INTEGER PRIMARY KEY,"
                + KEY_POINTER       + " STRING,"
                + KEY_URI           + " STRING,"
                + KEY_ORDER         + " INTEGER"
                + ")";

        db.execSQL(CREATE_STORIES_TABLE);
    }

现在在插入项目时添加订单。每次插入一行时只需增加 order 的值:

ContentValues values = new ContentValues();
values.put(KEY_POINTER,  pointer  );
values.put(KEY_URI,      filePath );
values.put(KEY_ORDER,    order );

// Inserting Row
long id = db.insert(TABLE_TEMP_BASESTORY_LIST, null, values);

简单地说,你不能这样做,

直接使用 Collections.reverse(storyDataList); 可能行不通 我建议获取所有数据并使用 ID 对其进行排序,例如使用 Comparable 并创建自定义 class 进行排序,例如

public class SortDataCompare implements Comparator<StoryData> {
    @Override
    public int compare(StoryData s1, StoryData s2) {
        return s1.getId().compareTo(s2.getId());
    }
}

并使用class喜欢

Collections.sort(storyDataList, new SortDataCompare());

然后你的 storyDataList 将被排序。