在 SQLite 上更新数据是使用 Update 还是 execSQL 更好?
Is it better to use Update or execSQL to update data on SQLite?
我在教程中看到了使用 execSQL 从 SQlite 数据库更新数据的代码:
String update = "UPDATE FRUIT SET COLOR=? WHERE ID=?";
myDatabase.execSQL( update, new Object[] {"RED", 7});
Cursor cursor = myDatabase.rawQuery("SELECT * FROM FRUIT;", null);
if (cursor.moveToFirst()) {
do {
String name = cursor.getString(cursor.getColumnIndex("NAME"));
String color = cursor.getString(cursor.getColumnIndex("COLOR"));
Log.i(TAG, "onCreate: Name: " + name + ", color: " + color);
} while (cursor.moveToNext());
}
但是,我在Android的官方文档中阅读了this:
使用 execSQL 的代码有效,但最好使用 update 或者我仍然可以使用 execSQL 因为它有效?什么对良好实践更好?由于本教程来自可靠来源,为什么他们使用 execSQL?
关于使用 execSQL
的 issue/warning 可能有几个原因,其中之一是您在使用 execSQL 时没有得到任何 returned,而便捷方法 return 可能有用的值。
insert
将 return 包含插入行的 ID 的 long else -1。
update
和 delete
return 受影响的行数。
使用方便的方法还可以通过构建底层 SQL、添加关键字和封闭字符串来减少输入错误的机会,并且对于一些重要的提供一定程度的保护以防止 SQL 注入( execSQL
的
bindArgs 还提供针对 SQL 注入的保护,与 rawQuery
) 类似。
但是,存在局限性,有时在某些更复杂的情况下需要使用 execSQL/rawQuery。
我在教程中看到了使用 execSQL 从 SQlite 数据库更新数据的代码:
String update = "UPDATE FRUIT SET COLOR=? WHERE ID=?";
myDatabase.execSQL( update, new Object[] {"RED", 7});
Cursor cursor = myDatabase.rawQuery("SELECT * FROM FRUIT;", null);
if (cursor.moveToFirst()) {
do {
String name = cursor.getString(cursor.getColumnIndex("NAME"));
String color = cursor.getString(cursor.getColumnIndex("COLOR"));
Log.i(TAG, "onCreate: Name: " + name + ", color: " + color);
} while (cursor.moveToNext());
}
但是,我在Android的官方文档中阅读了this:
使用 execSQL 的代码有效,但最好使用 update 或者我仍然可以使用 execSQL 因为它有效?什么对良好实践更好?由于本教程来自可靠来源,为什么他们使用 execSQL?
关于使用 execSQL
的 issue/warning 可能有几个原因,其中之一是您在使用 execSQL 时没有得到任何 returned,而便捷方法 return 可能有用的值。
insert
将 return 包含插入行的 ID 的 long else -1。
update
和 delete
return 受影响的行数。
使用方便的方法还可以通过构建底层 SQL、添加关键字和封闭字符串来减少输入错误的机会,并且对于一些重要的提供一定程度的保护以防止 SQL 注入( execSQL
的
bindArgs 还提供针对 SQL 注入的保护,与 rawQuery
) 类似。
但是,存在局限性,有时在某些更复杂的情况下需要使用 execSQL/rawQuery。