Tác dụng của QUOTE()
Hàm QUOTE() trả về chuỗi được bao quanh bởi dấu nháy đơn (') và escape các dấu nháy đơn bên trong bằng cách gấp đôi (''). Hữu ích khi xây dựng câu SQL động an toàn.
Ví dụ: Hiển thị tên với dấu nháy đơn
DatabaseHelper.java
package com.example.quotedemo;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
class DatabaseHelper extends SQLiteOpenHelper {
static final String DB_NAME = "salaryDatabase";
static final String TABLE = "SalaryDetails";
DatabaseHelper(Context context) {
super(context, DB_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE +
"(id INTEGER PRIMARY KEY, name TEXT, salary REAL, datetime DEFAULT CURRENT_TIMESTAMP)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int old, int n) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE);
onCreate(db);
}
boolean insert(String name, String salary) {
SQLiteDatabase db = getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("name", name);
cv.put("salary", salary);
db.insert(TABLE, null, cv);
return true;
}
// QUOTE(name) bao quanh tên bằng dấu nháy đơn
ArrayList<String> getAllContacts() {
ArrayList<String> list = new ArrayList<>();
SQLiteDatabase db = getReadableDatabase();
Cursor c = db.rawQuery(
"SELECT QUOTE(name) AS fullname FROM " + TABLE, null);
if (c.moveToFirst()) {
do {
list.add(c.getString(c.getColumnIndexOrThrow("fullname")));
} while (c.moveToNext());
}
c.close();
return list;
}
boolean update(String name, String salary) {
SQLiteDatabase db = getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("name", name);
cv.put("salary", salary);
db.update(TABLE, cv, "name=?", new String[]{name});
return true;
}
boolean delete() {
getWritableDatabase().delete(TABLE, null, null);
return true;
}
}
Kết quả
Nhập tên: sairam → ListView hiển thị: 'sairam'
Nhập tên: O'Connor → ListView hiển thị: 'O''Connor' (dấu nháy đơn bị escape).
Ứng dụng thực tế: Xây dựng SQL động an toàn
Thay vì nối chuỗi (dễ bị SQL Injection):
// Nguy hiểm
String sql = "SELECT * FROM users WHERE name = '" + userInput + "'";
// An toàn với QUOTE()
String sql = "SELECT * FROM users WHERE name = " + DatabaseUtils.sqlEscapeString(userInput);
// Hoặc tốt hơn: dùng parameterized query
String sql = "SELECT * FROM users WHERE name = ?";
Cursor c = db.rawQuery(sql, new String[]{userInput});
DatabaseUtils.sqlEscapeString() nội bộ dùng logic tương tự QUOTE().
Lưu ý
QUOTE()chỉ dùng cho giá trị chuỗi (text), không dùng cho số/date.- Luôn ưu tiên
?placeholder (parameterized query) thay cho xây dựng SQL động. - Hàm này chủ yếu dùng cho debug hoặc sinh script SQL.