当前位置: 首页 > 知识库问答 >
问题:

Android SQLiteDatabase位于顶部项目

张腾
2023-03-14

我希望所有新项目都添加到顶部,即,如果采用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;
}

共有2个答案

姬衡
2023-03-14

您似乎正在尝试更改SQL行的自动增量id。创建新行时会自动设置。您不能,或者至少不应该,设置自动增量id,或者依赖于表中行的物理顺序。

最好创建一个单独的列,其中包含整数形式的所需行顺序。然后,在查询表时,可以根据该列中的整数对行进行排序。

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

@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);
    }

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

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);
夏朗
2023-03-14

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

直接使用Collections.reverse(storyDataList);可能不起作用,所以我建议获取所有数据并使用ID对其进行排序,就像这里使用可比并创建自定义类进行排序一样

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

像这样使用类

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

然后,您的< code>storyDataList将被排序。

 类似资料:
  • 我想根据prestashop和wordpress变量是否被激活来更改databaseName变量的值。但我想在课堂上做这件事,我不知道它是否允许在那个地方使用“如果”。事实上,我在下面输入的代码给了我这个错误:“非法启动类型”。有可能解决这个问题吗?问候语。

  • 问题内容: 我有一个这样的引导页面: 好像: 因此,如果我在移动设备上查看它,则列A位于顶部,但我希望列B位于顶部。这可能吗?我尝试过推拉,但没有成功。 问题答案: 使用列排序来完成此操作。 将在“ md”或更大的视口上将列“推”到右侧6,并在“ md”上将列“推” 到左侧。在任何较小的视口上,列将再次保持正常顺序。 我认为让人们失望的 是,您必须在HTML中将B置于A之上。可能有不同的方法可以使

  • 下面的示例介绍了以下应用程序: 位于BorderLayout北边的按钮会将带有一些组件的GridBagLayout面板添加到BoxLayout中。Y_AXIS在BorderLayout中。CENTER。但是单击按钮后,面板会显示在中心,而不是添加到顶部。 播放锚()将单选按钮和一个标签设置到顶部,但第二个标签仍显示在中间。 如何让面板出现在顶部而不是中心?

  • 问题内容: 我有一个在控制台窗口中运行的简单Python脚本。 如何确保控制台窗口始终位于顶部,并在可能时调整其大小? 问题答案: 要在cmd窗口中执行此操作,您可能必须调用许多win32调用。 使用win32gui.EnumWindows枚举所有窗口以获取窗口句柄 找到与您的程序运行方式匹配的“窗口标题”。例如,在我的系统上双击.py文件,窗口标题为“ C:\ Python26 \ python

  • 问题内容: 我不确定我是否完全理解这两者之间的区别。 有人可以解释为什么我要在另一个上使用它们,以及它们之间的区别吗? 问题答案: 用于通过使用属性来调整元素。 用于测量相对于上一个元素到元素的外部距离。 此外,行为可以依赖于位置,种类而不同,或。

  • 我有一个非常标准的,带有垂直。我一直在顶部插入新项目,并调用 < 我希望列表保持滚动到顶部;总是显示第0个位置。 从我的需求的角度来看,< code>LayoutManager根据项目的数量表现不同。 虽然所有项目都适合屏幕,但它的外观和行为与我预期的一样:新项目总是出现在顶部,并移动其下的所有项目。 但是,一旦项目数超过RecyclerView的界限,新项目就会添加到当前可见项目的上方,但可见项