选择并存储在 Android 的 Cursor n 行中,其中一行具有特定的 id,其余行是随机的

Selecting and storing in Android's Cursor n number of rows where one row has a specific id and the rest are random

在 Android Studio 中,我正在尝试 select 来自 sqlite 数据库的特定行数,其中一行是根据给定的 id 预先确定的,其余行是随机选择的。查询应该保存在 Cursor 中,因为我会在 ListView 中显示 selected 行,它可以简单地通过 SimpleCursorAdapter 从 Cursor 获取信息。

初始数据库是这样创建的:

public void onCreate(SQLiteDatabase database) {
    database.execSQL("CREATE TABLE DICTIONARY(_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
            "english TEXT, " +
            "estonian TEXT);");
    addWordPair(database, "myriad", "tohutu hulk");
    addWordPair(database, "egregious", "jõletu");
    addWordPair(database, "erroneous", "väär");
    addWordPair(database, "salient", "esile tõusev");
    addWordPair(database, "galvanize", "laengut andma");
    addWordPair(database, "tenuous", "hõre");
    addWordPair(database, "caustic", "söövitav");
}

public void addWordPair(SQLiteDatabase database, String english, String estonian) {
    ContentValues wordPair= new ContentValues();
    wordPair.put("english", english);
    wordPair.put("estonian", estonian);
    database.insert("DICTIONARY", null, wordPair);
}

selected 行将使用光标显示在 ListView 中:

SimpleCursorAdapter listAdapter = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_1,
                cursor,
                selectedLanguage,
                new int[] {android.R.id.text1},
                0);
ListView listofWordsListView = (ListView) findViewById(R.id.wordsListView);
listofWordsListView.setAdapter(listAdapter);



我得到五个随机英文单词:

Cursor cursor = database.query("DICTIONARY Order By RANDOM() LIMIT 5",
                new String[] {"english"}, null, null, null,null, null);

我得到一个具有特定 id 的英文单词:

Cursor cursor = database.query("DICTIONARY", 
                new String[] {"english"},
                "_id = ?", 
                new String[] {Integer.toString(id)}, 
                null, null, null);

现在我需要在 cursor 中存储特定行和随机行(特定行最好在随机行之间)以便在 CursorAdapter 中使用它。

您可以使用 MergeCursor 将多个 Cursor 的结果合并为一个。

您可以使用 MergeCursor 例如:-

Cursor cursor1 = database.query("DICTIONARY Order By RANDOM() LIMIT 5",
                new String[] {"english"}, null, null, null,null, null);
Cursor cursor2 = database.query("DICTIONARY", 
                new String[] {"english"},
                "_id = ?", 
                new String[] {Integer.toString(id)}, 
                null, null, null);
MergeCursor merged = new MergeCursor(new Cursor[]{cursor1,cursor2});

您然后 treat/handle MergeCursor(在本例中 合并 )就像一个标准游标。

MergeCursor

在 SQL 中,您可以将查询与 compound query:

SELECT english FROM Dictionary WHERE _id = ?
UNION ALL
SELECT * FROM (SELECT english FROM Dictionary ORDER BY random() LIMIT 5);

(没有子查询,ORDER BY/LIMIT 也适用于第一部分。)

要将第一行放入随机位置,请重新排序:

SELECT english FROM Dictionary WHERE _id = ?
UNION ALL
SELECT * FROM (SELECT english FROM Dictionary ORDER BY random() LIMIT 5)
ORDER BY random();

要执行原始 SQL 查询,请使用 rawQuery():

Cursor cursor = database.rawQuery("SELECT .....", new String[]{ ... });