在 Android 中将来自不同表的行显示到一个 ListView - 没有 SQL JOIN

Displaying rows from different tables to one ListView in Android - without SQL JOIN

我是 Android 编程的超级新手,我一直坚持这个项目。

我有一个(conlang)词典数据库,其中每种语言都有自己的 table。用户搜索这些,结果将显示在 ListView 中。现在,我只能搜索一个 table.

我希望它能够搜索所有三个 tables 并将结果显示在 one ListView 中,每个 tables 的行.我想指出每一行来自哪个table。结果将显示如下内容:

From language

Lang Term : English term

Additional information

我已经设置了一个 CursorAdapter,目前它正在为三个 table 中的 一个 工作。

...

由于字典出处不同,所以信息也不尽相同。例如:

一个有 EngTermVLangTermFullDefinition

另一个有EngTermRLangTermPartOfSpeech

而另一个有EngTermGLangTermPartOfSpeech,PronounciationGuide(可能)。

例如,table1 可能包含“land”、“landing gear”和“landscape”的结果,table2 可能包含“land”、“landing”和“island” table3 可能包含“乏味”和“祖国”。

用户现在只能通过英文词条搜索这些table,并且可以select通过全词或部分词进行匹配。

由于它们的结构,我猜无法进行 JOIN 查询。

我不知道这是否有帮助,但现在,我的 SQLiteOpenHelper 中有这个方法 class:

public Cursor searchDictionaryByEnglish
            (boolean matchFullWordOnly, String searchTerm) {
    String sql = "SELECT * FROM " + TABLE_VULCAN +
            " WHERE " + COLUMN_ALL_ENG_TERM + " MATCH ?";
    if (!matchFullWordOnly)
        searchTerm = "*" + searchTerm + "*";
    return mDataBase.rawQuery(sql, new String[]{searchTerm});
}

(它正在搜索的是 FTS3 table,因此是 MATCH 而不是 LIKE。)

我希望我已经清楚地说明了我要完成的任务,但我不确定从哪里开始。我找到了一些关于 MergeCursor 的答案,但我不知道如何应用它,因为列的数量和名称不同。

创建一个接受您需要显示的字段的适配器。

以下是如何在其中一个表中没有任何列的情况下进行并集,如果您只搜索所有表都有的公共列,它将起作用。

SELECT  field1 ,
        field2 ,
        field3
FROM    ( SELECT    field1 ,
                    field2 ,
                    field3
          FROM      table1
          UNION
          SELECT    field1 ,
                    field2 ,
                    field3
          FROM      table2
          UNION
          SELECT    field1 ,
                    field2 ,
                    NULL AS field3
          FROM      table3
    ) tbl
WHERE tbl.field1 LIKE '%search_string%'

注意最后UNION中的NULL AS field3