我想在Android的SQLite数据库中插入一个表中的值,我想问一下,从下面给出的两种方法中,我应该选择哪种方法。我从一门课程中学到了第一种方法,但我想用第二种方法,这就是我问这个问题的原因
articleId、articleContent和articleTitle都是string类型。
如果您需要的话,请指定每种方法的优缺点,如果can.You可能建议另一种方法。
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 + ")");
发布于 2019-06-07 23:52:25
是的,建议始终使用bindString()
,以避免通过SQL注入在数据库中进行攻击。
在您的特定情况下,似乎要插入的值仅来自您的代码,而不是来自任何动态输入源--例如用户输入。在这种情况下,使用您在问题中提到的任何方法都是安全的。
在您的示例中,您也可以使用来自insert()
的SQLiteDatabase
类来代替字符串连接,这是安全的,不会出现任何语法错误:
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
类的SQLiteProgram
方法来执行我们需要传递值的sql。
另一个原因是,bindString()
可以调用java.lang.IllegalArgumentException
。因此,在发生语法错误时,使用此方法可以帮助进行异常处理和调试。
https://stackoverflow.com/questions/56504477
复制