Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQLite项的递归删除_Java_Android_Sqlite - Fatal编程技术网

Java SQLite项的递归删除

Java SQLite项的递归删除,java,android,sqlite,Java,Android,Sqlite,SQLite数据库示例: **我不创建数据库,它是Android书签数据库,我使用contentproviders访问它 **据我在一些搜索后了解,SQLite不支持外键约束,但触发器是可能的- 文件夹列->0=不是文件夹(false),1=文件夹(true) PARENTcolumn->保存其文件夹的ID ID TITLE FOLDER PARENT 1 folder1 1 0 2 item1 0 1 3 item2

SQLite数据库示例:

**我不创建数据库,它是Android书签数据库,我使用contentproviders访问它

**据我在一些搜索后了解,SQLite不支持外键约束,但触发器是可能的-

文件夹列->0=不是文件夹(false),1=文件夹(true)

PARENTcolumn->保存其文件夹的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,我想循环查找它的所有内部项目(更多文件夹和项目)

例如,我的ID=1,因此我可以通过请求查询其父项ID=1的所有项目,获取项目ID,然后删除,从而轻松删除ID 2和3

问题是我不知道如何删除ID=4及其内部项(item1、item2和folder3),然后再删除folder3内部项

我希望能得到一些帮助!我试了几个小时:\


谢谢

听起来你想在“家长”栏中使用。这样,当删除父级时,将其指定为父级的所有文件夹和文件也将被删除。然后,这些结果将通过数据库“级联”

因此,您可以这样创建表:

CREATE TABLE files (id PRIMARY KEY AUTOINCREMENT, title TEXT, folder INTEGER CHECK(FOLDER EQUALS 0 OR FOLDER = 1), parent REFERENCES id);
就这样。现在,每次删除父文件夹时,它的所有子文件夹都将被删除。你不必做任何其他事情


具有布尔属性(如本例中的文件夹列)通常被认为是不好的做法。在您的情况下,最好将文件夹和文件放在不同的表中,因为它们是不同的东西。这就是所谓的。这就是说,我可以看到这样的论点:现在设置东西的方式仍然可以,因为从技术上讲,文件夹只是设置了特殊标志的文件。不过,您可能仍然应该考虑创建不同表的想法。

如果在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");
    }
  }
}

您希望(必须)如何解决这个问题,在(一个)SQL语句中还是在“Java”?@home中使用Java(稍后我将使用一些我必须使用的Android API对其进行修改)。听起来像是解决方案。我真的可以用一个例子来说明如何在查询中使用它…惊人的答案:)问题是我没有创建表,它是一个Android SQLite表(我使用contentProviders-managedQuery访问它…)。不管怎样,我可以在查询数据库时使用这个?哦,这个表不是你的?嗯……这样的解决方案对你就不起作用了。我还得想点别的。用一些修改来测试你的代码。可能有用。moveToFirst()和moveToNext()将替换FindNextChildyLeah,您在编写它时刚刚发现:)太棒了!在做了一些改变后,这应该会起作用。非常感谢。