在 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 中的 一个 工作。
...
由于字典出处不同,所以信息也不尽相同。例如:
一个有 EngTerm
、VLangTerm
、FullDefinition
列
另一个有EngTerm
、RLangTerm
、PartOfSpeech
而另一个有EngTerm
、GLangTerm
、PartOfSpeech,
和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
。
我是 Android 编程的超级新手,我一直坚持这个项目。
我有一个(conlang)词典数据库,其中每种语言都有自己的 table。用户搜索这些,结果将显示在 ListView 中。现在,我只能搜索一个 table.
我希望它能够搜索所有三个 tables 并将结果显示在 one ListView 中,每个 tables 的行.我想指出每一行来自哪个table。结果将显示如下内容:
From language
Lang Term : English term
Additional information
我已经设置了一个 CursorAdapter,目前它正在为三个 table 中的 一个 工作。
...
由于字典出处不同,所以信息也不尽相同。例如:
一个有 EngTerm
、VLangTerm
、FullDefinition
另一个有EngTerm
、RLangTerm
、PartOfSpeech
而另一个有EngTerm
、GLangTerm
、PartOfSpeech,
和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
。