Android SQLite更新 - 为什么在哪里?

时间:2018-02-16 14:25:20

标签: android sqlite sql-update

SQLite的Android SDK文档提供了update方法,该方法将四个值 - table, values, whereClause, whereArgs作为参数。前三个完全有道理。但是,我不清楚使用whereArgswhereClause包含?'s而不是发送完全准备好的whereClause可以提供任何好处 - 无论是在安全性方面(没有任何迹象表明这有助于消毒SQL)或速度。那么,沿着那条路走下去的好处是什么,而不是简单地传递一个完整的where字符串和一个空whereArgs

2 个答案:

答案 0 :(得分:2)

文档说:

  

字符串:您可以在where子句中包含?s,它将被whereArgs中的值替换。这些值将绑定为字符串。

这有点误导。否#34;替换"实际发生。相反,?是变量而whereArgs是绑定到这些变量的值,并且此绑定发生在sqlite SQL程序中。

使用变量绑定可以避免SQL注入等问题,而无需清理输入。

如果您使用不同的变量值一遍又一遍地执行相同的SQL程序,类似的机制对于性能将是有益的。您只需编译一次SQL。 Android SQLite机制为SQLiteStatement(请参阅其bind...()超类中的SQLiteProgram方法)。

答案 1 :(得分:1)

安全绝对是一个问题。如果使用字符串连接,则易受SQL注入攻击。使用?whereArgs确实会对输入进行清理,以确保您的安全。

还有预编译语句的情况 - 您只编译一次,然后为每个参数占位符绑定不同的值。这将为您带来性能方面的好处。用你的方法无法做到这一点。