SQLiteStatement выполняет SELECT / INSERT / DELETE / UPDATE

Я использую скомпилированный SQLiteStatement с транзакциями в оптимизации транзакций SQLite, но я читаю документацию для execute функция:

Выполните этот оператор SQL, если это не SELECT / INSERT / DELETE / UPDATE, например, таблица CREATE / DROP, представление, триггер, индекс и т. Д.

Кажется, это подразумевает, что эта функция не должна использоваться с SELECT / INSERT / DELETE / UPDATE заявления, но у меня есть код, который использует его со вставкой и работает.

Я в курсе executeInsert и другие методы, но executeUpdateDelete недоступно на моем уровне API, поэтому я могу использовать execute?

Также, если мне не нужен последний идентификатор вставки или количество затронутых строк, я должен использовать execute вместо executeInsert и т. д., другими словами, эффективнее ли?

2 ответа

Решение

execute вероятно не быстрее чем executeInsert, может быть даже медленнее (на ICS execute звонки executeUpdateDelete и сбрасывает возвращаемое значение). Вам нужно проверить это, но я сомневаюсь, что вы найдете здесь реальную разницу.

AFAIK, безопасно использовать просто execute если вам не нужны возвращаемые значения, но я бы не стал рассчитывать на то, что это верно в будущих версиях Android. Документация говорит нет, так что, возможно, кто-то собирается изменить поведение, чтобы отразить это. Старые реализации, кажется, используют execute тоже (например, 2.1 delete() Исходный код). Например, Jelly Bean сильно изменился за кулисами SQLite, но он все равно должен работать при использовании execute

Кроме того, если вы не используете то же самое SQLiteStatement Снова и снова, просто перевязывая аргументы, вероятно, не стоит его использовать. Создание нового каждый раз, когда вы звоните регулярному insert, update,... методы быстры по сравнению с фактическим доступом к базе данных и требуемым дисковым вводом / выводом. Транзакции, с другой стороны, очень помогают, поскольку синхронизация состояния базы данных на диске для каждого оператора выполняется очень медленно.

Используйте SQLiteDatabase вместо SQLiteStatement для взаимодействия с вашей базой данных. SQLiteStatements не являются потокобезопасными, поэтому я бы не использовал их для SELECT / INSERT / DELETE / UPDATE. Также вы должны стараться не использовать необработанные запросы к базе данных ни для чего, кроме Selects, Есть встроенные вспомогательные функции, которые повысят производительность вашей базы данных. По вашему случаю SQLiteDatabase у вас есть.insert,.update,.delete и я использую.rawQuery для выбора.

Другие вопросы по тегам