Ответ 1
IMHO, более эффективно отказаться от таблицы и воссоздать ее. И да, вы можете использовать "IF EXISTS" в этом случае.
Чтобы усечь таблицу в SQLite, мне нужно использовать этот синтаксис:
DELETE FROM someTable
Но как я обрезаю таблицу только в том случае, если она существует?
К сожалению, это вызывает ошибку:
DELETE FROM someTable IF EXISTS
Это также не работает:
DELETE IF EXISTS FROM someTable
Спасибо.
IMHO, более эффективно отказаться от таблицы и воссоздать ее. И да, вы можете использовать "IF EXISTS" в этом случае.
Это двухэтапный процесс:
Удалите все данные из этой таблицы, используя:
Delete from TableName
Тогда:
DELETE FROM SQLITE_SEQUENCE WHERE name='TableName';
Просто сделайте delete
. Это из документации SQLite:
"Когда WHERE не указывается в инструкции DELETE, а удаляемая таблица не имеет триггеров, SQLite использует оптимизацию для стирания всего содержимого таблицы без необходимости посещать каждую строку таблицы отдельно. Эта оптимизация" усечения "делает delete до версии 3.6.5, оптимизация truncate также означала, что интерфейсы sqlite3_changes() и sqlite3_total_changes() и прагма count_changes на самом деле не вернут количество удаленных строк. Эта проблема исправлена с версии 3.6.5".
Я получил его для работы с:
SQLiteDatabase db= this.getWritableDatabase();
db.delete(TABLE_NAME, null, null);
SELECT name FROM sqlite_master where name = '<TABLE_NAME_HERE>'
Если имя таблицы не существует, то никаких возвращенных записей не будет!
Вы также можете использовать
SELECT count(name) FROM sqlite_master where name = '<TABLE_NAME_HERE>'
если счетчик равен 1, значит, существует таблица, в противном случае она вернет 0
После удаления я также использую команду VACUUM
. Поэтому для полного эквивалента TRUNCATE
я использую этот код:
DELETE FROM <table>;
UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = '<table>';
VACUUM;
Удаление для меня не работает для reset Auto Increment
DELETE FROM "sqlite_sequence" WHERE "name"='<table>';
Чтобы узнать больше о VACUUM, вы можете перейти сюда: https://blogs.gnome.org/jnelson/2015/01/06/sqlite-vacuum-and-auto_vacuum/
К сожалению, у нас нет команды TRUNCATE TABLE в SQLite, но вы можете использовать команду SQLite DELETE
для удаления полных данных из существующей таблицы, хотя рекомендуется использовать команду DROP TABLE
для удаления полный стол и снова создать его снова.
"sqllite" не имеет порядка "TRUNCATE", как mysql, тогда мы должны получить другой путь... эта функция (reset_table) frist удаляет все данные в таблице, а затем reset AUTOINCREMENT key в таблице.... теперь вы можете использовать эту функцию каждый раз, когда хотите...
пример:
private SQLiteDatabase mydb;
private final String dbPath = "data/data/your_project_name/databases/";
private final String dbName = "your_db_name";
public void reset_table(String table_name){
open_db();
mydb.execSQL("Delete from "+table_name);
mydb.execSQL("DELETE FROM SQLITE_SEQUENCE WHERE name='"+table_name+"';");
close_db();
}
public void open_db(){
mydb = SQLiteDatabase.openDatabase(dbPath + dbName + ".db", null, SQLiteDatabase.OPEN_READWRITE);
}
public void close_db(){
mydb.close();
}