BlackBerry SQLite массовый удалить лучшие практики - PullRequest
2 голосов
/ 20 января 2012

У меня есть база данных SQLite, из которой мне нужно периодически удалять записи. Каков наилучший способ сделать это? У меня есть массив уникальных идентификаторов ПК. Я придумал 2 метода:

Использование подготовленного утверждения

    int[] ids = {1,2,3,4,5}; //example only, will be built elsewhere
    Database db = null;
    try {
        db = DataConnection.getInstance(); //my class to get the connection instance
        db.beginTransaction();
        Statement st = db.createStatement("DELETE FROM myTable WHERE id = ?");
        st.prepare();
        for (int i=0;i<ids.length;i++) {
            st.bind(1, ids[i]);
            st.execute();
            st.reset();
        }
        db.commitTransaction();
    } catch (FileIOException e) {
        e.printStackTrace();
    } catch (DatabaseException e) {
        e.printStackTrace();
    }

Или с помощью ключевого слова "in"

    int[] ids = {1,2,3,4,5}; //example only, will be built elsewhere
    Database db = null;
    try {
        db = DataConnection.getInstance();
        //Util.JoinArray(int[] ids,char delim, char prepend, char postpend) returns a String of the ids separated by delim with prepend at the front and postpend at the end
        Statement st = db.createStatement("DELETE FROM myTable WHERE id IN " + Util.joinArray(ids,',','(',')'));
        st.prepare();
    } catch (FileIOException e) {
        e.printStackTrace();
    } catch (DatabaseException e) {
        e.printStackTrace();
    }

1 Ответ

4 голосов
/ 20 января 2012

Идеальным подходом было бы сочетание двух: подготовленное утверждение всех идентификаторов.

Итак, избегайте SQL-инъекций и используйте такой подход (в псевдокоде):

query = "DELETE FROM myTable WHERE id IN (";
for (int i = 0; i < ids.count; i++)
    query.Append("?,");
query.DropLast(); //Remove the last comma
query.Append(")");
st = db.createStatement(query);
st.prepare();
for (int i = 0; i < ids.count; i++)
    st.bind(i+1, ids[i]);

С точки зрения производительности, это может быть лучше, поскольку база данных будет перебалансировать индексы после всех удалений. Работа в транзакции и фиксация один раз после всех отдельных удалений делали бы, по сути, то же самое. Подход, который я предлагаю, только безопаснее.

Как часто обсуждается в SO, производительность SQLite сильно различается по различным критериям, а именно по структуре, количеству строк, размеру страницы и т. Д. Универсального подхода «быстрее во всех случаях» с SQLite не существует. Ваш пробег будет варьироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...