将 SQLite 搜索参数修改为 Return 一个单词的完整字符串而不是特定顺序

Modifying SQLite Search Parameters to Return Full String From One Word Instead of Specific Order

我在 SQLite 中更改搜索参数时遇到问题,目前,我用于搜索电影片名和类型的搜索功能只能 return 特定结果,例如 Action只会带回动作片,不会带回动作片、冒险片。

我有一个朋友设法让它在 SQLite Studio 本身内工作,但是使用这种方法一直没有成功。他建议使用以下 ORDER BY,但是,它仍然给出相同的结果。

 Cursor c = sqdb.rawQuery("SELECT * FROM filmography WHERE genre LIKE '%" + searchGenre + "' ORDER BY LENGTH(genre) ASC",
                null);

我现在很茫然,因为我似乎无法找到或找出答案。我将如何更改 SQL 以便如果您要在类型搜索中搜索“动作”,它会带回所有结果,例如“电影 1 = 动作,电影 2 = 动作,冒险” , Film 3 = Action, Crime”等等?

类型数据示例:“卡彭,传记,犯罪,剧情,丰斯,2020 年,4.7/10 黑鹰坠落, 戏剧, 历史, War, Twombly, 2001, 7.7/10 毒液, 动作, 冒险, 科幻, Eddie Brock / 毒液, 2018, 6.7/10

 public String searchByTitleInFilmography(SQLiteDatabase sqdb, String searchfilmTitle)
    {
        String result = "";

        Cursor c = sqdb.rawQuery("SELECT * FROM filmography WHERE filmTitle =  '" + searchfilmTitle + "'",
                null);

        if (c != null)
        {
            if (c.moveToFirst())
            {
                do
                {
                    String id = c.getString(0);
                    result = result + id + ": ";

                    String filmtitle = c.getString(1);
                    result = result + "Title: " + filmtitle + ". ";

                    String genre = c.getString(2);
                    result = result + "Genre(s): " + genre + ". ";

                    String role = c.getString(3);
                    result = result + "Role: " + role + ". ";

                    String year = c.getString(4);
                    result = result + "Released: " + year + ". ";

                    String imdbrating = c.getString(5);
                    result = result + "Rating: " + imdbrating + "\n" + "\n";

                    Log.w("FILM_TITLE_GENRE", "ID - " + id +":" + " Genre(s) = " + genre);

                } while (c.moveToNext());
            }
            else
            {
                result = "No Films Found With The Title = " + searchfilmTitle;
            }
        }
        c.close();

        return result;

    } //  public String serachByTitleInFilmography(SQLiteDatabase sqdb, String searchTitle)

如果列 genre 包含类似逗号分隔的流派列表的值,那么您应该像这样更改运算符 LIKE 的操作数:

String sql = "SELECT * FROM filmography WHERE ',' || REPLACE(genre, ', ', ',') || ',' LIKE '%,' || ? || ',%'"
Cursor c = sqdb.rawQuery(sql, new String[] {searchGenre});

REPLACE() 删除每个逗号后的所有空格,genre 的每个值变为:',Action,Crime,Drama,'.
当您将 'Action' 作为 ? 占位符的参数传递时,sql 语句变为:

SELECT * FROM filmography WHERE ',Action,Crime,Drama,' LIKE '%,Action,%'

这就是您想要的:在 genre.

列的任意位置包含 'Action' 的所有行