我想在 Android Studio 中的 SQLite 数据库的表中插入值。我想问我应该从下面给定的两种方法中选择哪种方法。 我从类(class)中学到了第一种方法,但我想使用第二种方法。这就是我问这个问题的原因
articleId、articleContent和articleTitle都是字符串类型。
如果可以的话,请说明每种方法的优缺点。如果您愿意,您可以建议其他方法。
String sql = "INSERT INTO articles (articleId, title, content) VALUES (?, ?, ?)";
SQLiteStatement statement = articlesDB.compileStatement(sql);
statement.bindString(1, articleId);
statement.bindString(2, articleTitle);
statement.bindString(3, articleContent);
statement.execute();
或者简单地使用字符串连接:
sqliteDatabase.execSQL("INSERT INTO articles (articleId, title, content) VALUES (" + articleId + ", " + articleTitle + ", " + articleContent + ")");
最佳答案
是的,始终建议使用bindString()
来避免通过 SQL 注入(inject)对数据库进行可能的攻击。</strong>
在您的特定情况下,似乎要插入的值仅来自您的代码,而不是来自任何动态输入源 - 例如用户输入。在这种情况下,使用您在问题中提到的任何方法都是安全的。
在您的情况下,您还可以使用 SQLiteDatabase
类中的 insert()
来代替字符串连接,这样不会出现任何语法错误:
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("articleId", articleId);
values.put("title", articleTitle);
values.put("content", articleContent);
db.insert("articles", null, values);
它返回新插入行的行 ID,如果发生错误,则返回 -1。
但是,如果您从用户输入中获取值,那么使用字符串连接会使您的数据库完全容易受到潜在攻击者的攻击。这就是为什么我们总是建议在需要传递值的地方使用SQLiteProgram
类的bindString()
方法来执行sql。
另一个原因是,bindString()
可以调用java.lang.IllegalArgumentException
。因此,使用此方法有助于异常处理和调试,以防发生语法错误。
关于java - 使用 SQLitestatement bindstring 方法代替简单的字符串连接来执行 sql 语句有什么优点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56504477/