SQLite pragma 命令中的 Android Studio 标记错误,<pragma value> 应为“ON”

Posted

技术标签:

【中文标题】SQLite pragma 命令中的 Android Studio 标记错误,<pragma value> 应为“ON”【英文标题】:Android Studio flagging error in SQLite pragma command, <pragma value> expected, got 'ON' 【发布时间】:2018-04-13 22:13:12 【问题描述】:

我认为这是切换到 android Studio 3.0 后出现的新错误。我收到一个 lint 语法错误:

&lt;pragma value&gt; expected, got 'ON'

我仅在以下两种方法中的第一种方法中出现此错误:

private static void setForeignKeyConstraintsEnabled(@NonNull SQLiteDatabase db) 
    if (!db.isReadOnly()) 
        db.execSQL("PRAGMA foreign_keys=ON;");
    


private static void setForeignKeyConstraintsDisabled(@NonNull SQLiteDatabase db) 
    if (!db.isReadOnly()) 
        db.execSQL("PRAGMA foreign_keys=OFF;");
    

我只找到了一个suggested fix on the internet as of writing。它是德文的,说我不应该对编译指示使用常量字符串,而应该使用字符串参数。

String query = String.format ("PRAGMA foreign_keys = %s","ON"); 
db.execSQL(query); 

但我怀疑如果这消除了错误,它只是通过使代码过于复杂而无法检测到 lint 规则来实现。

为什么ON 会抛出错误而不是OFF?我的语法错了吗?

【问题讨论】:

我猜这是 Lint 规则中的一个错误。你可以试试alternative syntax(小写no、0、括号而不是=等)看看你能不能得到一些简单的东西并通过Lint。 @CommonsWare,谢谢,使用带符号的数字语法解决了这个错误 尽管对您当前删除的答案发表了评论,但您回答自己的问题是完全合理的。特别是,对于这种情况,我会建议你写下答案,因为你有工作代码。我投票取消删除你的答案,我建议你恢复它。 完成!感谢您的指导! 【参考方案1】:

使用有符号整数alternative syntax 有效。

private static void setForeignKeyConstraintsEnabled(@NonNull SQLiteDatabase db) 
    if (!db.isReadOnly()) 
        db.execSQL("PRAGMA foreign_keys=1;");
    


private static void setForeignKeyConstraintsDisabled(@NonNull SQLiteDatabase db) 
    if (!db.isReadOnly()) 
        db.execSQL("PRAGMA foreign_keys=0;");
    

有趣的是,使用 yes/no 的替代语法在 no 而不是 yes 上标记了错误。我同意@CommonsWare 的观点,这似乎是一个 lint 错误。

【讨论】:

不介意我说,但您应该让@CommonsWare 将其发布为答案,恕我直言,您应该通知他并要求他将其发布为答案,但这只是我的意见(将很快删除评论,如果你不喜欢请忽略) FWIW,我提交了a bug report。 ONonno 被标记为无效,而后两者被明确记录为正确。

以上是关于SQLite pragma 命令中的 Android Studio 标记错误,<pragma value> 应为“ON”的主要内容,如果未能解决你的问题,请参考以下文章

如何在SQLite中添加自己的PRAGMA语句来存储自定义元数据?

不要通过 QSqlQuery 获得所有 sqlite pragma 的结果

sqlite命令查看数据库当前版本号

Massive.Sqlite.cs -- 原型失败,因为没有 COLUMN_NAME;修复使用 PRAGMA table_info?

为啥 SQLite pragma foreign_keys 在数据库连接中不持久?

求Sqlite no-op 命令