Рекурсивное удаление элементов SQLite - PullRequest
2 голосов
/ 31 октября 2011

Пример базы данных SQLite:

** Я не создаю базу данных, это база данных Android Bookmarks, к которой я обращаюсь с помощью контент-провайдеров.

** Из того, что я понимаю после некоторых поисков, SQLite не поддерживает ограничения внешнего ключа, но возможны триггеры - http://www.sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers

FOLDER столбец -> 0 = не папка (false), 1 = папка (true)

PARENT столбец -> содержит ID своей папки

ID  TITLE     FOLDER   PARENT
1   folder1      1        0
2   item1        0        1
3   item2        0        1
4   folder2      1        1
5   item1        0        4
6   item2        0        4
7   folder3      1        4
8   item1        0        7
9   item2        0        7

... и т. Д.

В моем приложении для Android я пытаюсь рекурсивно удалить элементы из базы данных SQLite. У меня есть идентификатор первой папки, и я хочу выполнить цикл, чтобы найти все ее внутренние элементы (больше папок и элементов).

Например, у меня есть ID = 1, поэтому я могу легко удалить идентификаторы 2 и 3, запросив запрос всех элементов, у которых родительский элемент - ID = 1, получить идентификаторы элементов и затем удалить.

Проблема в том, что я не могу понять, как удалить ID = 4 и его внутренние элементы (item1, item2 и folder3), а затем внутренние объекты folder3.

Хотелось бы помочь с этим! пытался часами: \

Спасибо!

Ответы [ 2 ]

4 голосов
/ 31 октября 2011

Звучит так, как будто вы хотите использовать ON DELETE CASCADE в вашем «родительском» столбце.Таким образом, когда родитель удаляется, все папки и файлы, которые указывают его как родителя, также будут удалены.Затем эти результаты будут «каскадно» проходить через вашу базу данных.

Таким образом, вы создадите свою таблицу следующим образом:

CREATE TABLE files (id PRIMARY KEY AUTOINCREMENT, title TEXT, folder INTEGER CHECK(FOLDER EQUALS 0 OR FOLDER = 1), parent REFERENCES id);

Вот и все.Теперь каждый раз, когда вы удаляете родительскую папку, все ее дочерние элементы будут удалены.Больше ничего делать не нужно.

PS Наличие булевых атрибутов (например, столбца папки в этом случае) обычно считается плохой практикой.В вашем случае было бы лучше иметь папки и файлы в разных таблицах, потому что это разные вещи.Это называется нормализация .Тем не менее, я мог видеть аргумент, что способ, которым вы сейчас настраиваете, все еще в порядке, потому что технически папки - это просто файлы, для которых установлен специальный флаг.Тем не менее, вам все же, вероятно, стоит рассмотреть идею создания в разных таблицах.

2 голосов
/ 31 октября 2011

Если в Java, то что-то вроде этого, я думаю, я думаю, функции вроде findNextChildId не должно быть проблемой:

 deleteFolderAndSub(int id){
        int childId = findNextChildId(id);
         //Let -1 be that there are no more children
        while (childId!=-1){
        if (checkIfFolder(childId)){
            deleteFolderAndSub(childId);
    //on exiting from above function folder should be empty so it can be deleted without problem
            deleteEmptyFolder(id);
        } else {
            deleteitem(id);
        }
//it should be while loop and we have to find another child inside the loop
        childId = findNextChildId(id)
      }
    }

findNextChildId(int parentId){
   Coursor yourCoursor;
  while(yourCoursor.moveToNext()){
    if (parentId==yourCoursor.getInt("PARENT")){
        yourCoursor.getInt("ID");
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...