【问题标题】:Escape special characters in Room Database Query转义房间数据库查询中的特殊字符
【发布时间】:2019-09-12 00:39:43
【问题描述】:

我的 Dao 文件中有以下代码。

@Query("SELECT * FROM ${Test.TABLE_NAME} WHERE primary_key = :primaryKey LIMIT 1")
fun selectTest(primaryKey: String): Test?

问题是primaryKey 是一个可以包含/ 的字符串。如Test/4。这会导致查询失败。我尝试在:primaryKey 周围加上引号,但随后 Room 不再绑定它。我还尝试在 primaryKey 字符串中添加转义引号,该字符串将绑定到查询,但这也不起作用。

关于如何处理的想法?

【问题讨论】:

    标签: android android-sqlite android-room


    【解决方案1】:

    表名包含特殊字符,需要用 SQLite 和 ROOM 都可以接受的字符括起来。

    在 SQLITE 中,您可以使用以下之一:-

    `tablename` 
    "tablename" 
    'tablename' 
    [tablename] 
    

    但是 ROOM 比较麻烦,因为它不允许您使用中间的两个。因此尝试:-

    @Query("SELECT * FROM `${Test.TABLE_NAME}` WHERE primary_key = :primaryKey LIMIT 1")
    fun selectTest(primaryKey: String): Test?
    

    @Query("SELECT * FROM [${Test.TABLE_NAME}] WHERE primary_key = :primaryKey LIMIT 1")
    fun selectTest(primaryKey: String): Test?
    

    测试

    • 请注意,以上是原理代码,未经测试或运行,因此可能包含小错误。但是,为了方便起见,已通过改编另一个问题的答案中的代码来测试等效的 java 代码。

    使用:-

    @Query("SELECT * FROM `/cards` WHERE card_name LIKE :cardName")
    Cards[] getCardsByName(String cardName);
    
    @Query("SELECT * FROM [" + GamesDatabase.TABLENAMECARDS +"] WHERE card_name LIKE :cardName")
    Cards[] getFunnyCardsByName(String cardName);
    
    • GamesDatabase.TABLENAMECARDS 是相同的表名,但作为 CONSTANT 即 /cards

    上面的 Dao 使用了 :-

        String cardToGet = "%/";
        Cards[] retrievedCards = mGamesDao.getCardsByName(cardToGet);
        for (Cards c: retrievedCards) {
            logCardsInfo(c,"GETCARDSBYNAME");
        }
    
        retrievedCards = mGamesDao.getFunnyCardsByName(cardToGet);
        for (Cards c: retrievedCards) {
            logCardsInfo(c,"GETCARDSBYFUNNYNAME");
        }
    

    logCardsInfo 方法将 Card、名称、值、id、Folder 和 Category 写入日志,TAG 是传递的第二个参数。

    其中 Cards 包含一包卡片(带有一个名为 ooops 的额外花色,不是花色等同于类别,文件夹每个类别有两个,但 7 在 normalcards 文件夹中)但卡片的名称值为 7是 7/ 而不是 7,因此两者都将提取 5 张卡片:-

    2019-09-16 15:01:46.084 19140-19140/aso.so57943963foreignkeys D/GETCARDSBYNAME: Card Name is 7/
            Value is 7
            CardID is 10
            In Folder NormalCards
                In Category Spades
    2019-09-16 15:01:46.089 19140-19140/aso.so57943963foreignkeys D/GETCARDSBYNAME: Card Name is 7/
            Value is 7
            CardID is 23
            In Folder NormalCards
                In Category Hearts
    2019-09-16 15:01:46.094 19140-19140/aso.so57943963foreignkeys D/GETCARDSBYNAME: Card Name is 7/
            Value is 7
            CardID is 36
            In Folder NormalCards
                In Category Clubs
    2019-09-16 15:01:46.101 19140-19140/aso.so57943963foreignkeys D/GETCARDSBYNAME: Card Name is 7/
            Value is 7
            CardID is 49
            In Folder NormalCards
                In Category Diamonds
    2019-09-16 15:01:46.107 19140-19140/aso.so57943963foreignkeys D/GETCARDSBYNAME: Card Name is 7/
            Value is 7
            CardID is 62
            In Folder NormalCards
                In Category ooops
    2019-09-16 15:01:46.110 19140-19140/aso.so57943963foreignkeys D/GETCARDSBYFUNNYNAME: Card Name is 7/
            Value is 7
            CardID is 10
            In Folder NormalCards
                In Category Spades
    2019-09-16 15:01:46.114 19140-19140/aso.so57943963foreignkeys D/GETCARDSBYFUNNYNAME: Card Name is 7/
            Value is 7
            CardID is 23
            In Folder NormalCards
                In Category Hearts
    2019-09-16 15:01:46.118 19140-19140/aso.so57943963foreignkeys D/GETCARDSBYFUNNYNAME: Card Name is 7/
            Value is 7
            CardID is 36
            In Folder NormalCards
                In Category Clubs
    2019-09-16 15:01:46.121 19140-19140/aso.so57943963foreignkeys D/GETCARDSBYFUNNYNAME: Card Name is 7/
            Value is 7
            CardID is 49
            In Folder NormalCards
                In Category Diamonds
    2019-09-16 15:01:46.122 19140-19140/aso.so57943963foreignkeys D/GETCARDSBYFUNNYNAME: Card Name is 7/
            Value is 7
            CardID is 62
            In Folder NormalCards
                In Category ooops
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 2016-01-14
      • 2014-12-14
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多