Для подготовленных операторов SQLite в Android есть SQLiteStatement . Подготовленные операторы помогают повысить производительность (особенно для операторов, которые должны выполняться несколько раз), а также помогают избежать атак с использованием инъекций. См. эту статью для общего обсуждения подготовленных заявлений.
SQLiteStatement
предназначен для использования с операторами SQL, которые не возвращают несколько значений. (Это означает, что вы не будете использовать их для большинства запросов.) Ниже приведены некоторые примеры:
String sql = "CREATE TABLE table_name (column_1 INTEGER PRIMARY KEY, column_2 TEXT)";
SQLiteStatement stmt = db.compileStatement(sql);
stmt.execute();
Метод execute()
не возвращает значение, поэтому его целесообразно использовать с CREATE и DROP, но он не предназначен для использования с SELECT, INSERT, DELETE и UPDATE, поскольку они возвращают значения. (Но см. этот вопрос .)
String sql = "INSERT INTO table_name (column_1, column_2) VALUES (57, 'hello')";
SQLiteStatement statement = db.compileStatement(sql);
long rowId = statement.executeInsert();
Обратите внимание, что вместо execute()
используется метод executeInsert()
. Конечно, вы не хотели бы всегда вводить одни и те же вещи в каждом ряду. Для этого вы можете использовать bindings .
String sql = "INSERT INTO table_name (column_1, column_2) VALUES (?, ?)";
SQLiteStatement statement = db.compileStatement(sql);
int intValue = 57;
String stringValue = "hello";
statement.bindLong(1, intValue); // 1-based: matches first '?' in sql string
statement.bindString(2, stringValue); // matches second '?' in sql string
long rowId = statement.executeInsert();
Обычно вы используете подготовленные операторы, когда хотите быстро что-то повторить (например, ВСТАВИТЬ) много раз. Подготовленный оператор делает так, что оператор SQL не нужно каждый раз анализировать и компилировать. Вы можете еще больше ускорить процесс, используя транзакций . Это позволяет применять все изменения сразу. Вот пример:
String stringValue = "hello";
try {
db.beginTransaction();
String sql = "INSERT INTO table_name (column_1, column_2) VALUES (?, ?)";
SQLiteStatement statement = db.compileStatement(sql);
for (int i = 0; i < 1000; i++) {
statement.clearBindings();
statement.bindLong(1, i);
statement.bindString(2, stringValue + i);
statement.executeInsert();
}
db.setTransactionSuccessful(); // This commits the transaction if there were no exceptions
} catch (Exception e) {
Log.w("Exception:", e);
} finally {
db.endTransaction();
}
Проверьте эти ссылки для получения дополнительной полезной информации о транзакциях и ускорении вставок в базу данных.
Это базовый пример. Вы также можете применить концепции из раздела выше.
String sql = "UPDATE table_name SET column_2=? WHERE column_1=?";
SQLiteStatement statement = db.compileStatement(sql);
int id = 7;
String stringValue = "hi there";
statement.bindString(1, stringValue);
statement.bindLong(2, id);
int numberOfRowsAffected = statement.executeUpdateDelete();
Метод executeUpdateDelete()
также может использоваться для операторов DELETE и был введен в API 11. См. Эти вопросы и ответы .
Вот пример.
try {
db.beginTransaction();
String sql = "DELETE FROM " + table_name +
" WHERE " + column_1 + " = ?";
SQLiteStatement statement = db.compileStatement(sql);
for (Long id : words) {
statement.clearBindings();
statement.bindLong(1, id);
statement.executeUpdateDelete();
}
db.setTransactionSuccessful();
} catch (SQLException e) {
Log.w("Exception:", e);
} finally {
db.endTransaction();
}
Обычно, когда вы запускаете запрос, вы хотите вернуть курсор назад с большим количеством строк. Это не то, для чего SQLiteStatement
, хотя. Вы не запускаете запрос с ним, если вам не нужен только простой результат, например количество строк в базе данных, которое вы можете сделать с помощью simpleQueryForLong()
String sql = "SELECT COUNT(*) FROM table_name";
SQLiteStatement statement = db.compileStatement(sql);
long result = statement.simpleQueryForLong();
Обычно вы запускаете query()
метод SQLiteDatabase , чтобы получить курсор.
SQLiteDatabase db = dbHelper.getReadableDatabase();
String table = "table_name";
String[] columnsToReturn = { "column_1", "column_2" };
String selection = "column_1 =?";
String[] selectionArgs = { someValue }; // matched to "?" in selection
Cursor dbCursor = db.query(table, columnsToReturn, selection, selectionArgs, null, null, null);
См. этот ответ для более подробной информации о запросах.