Java SQLite项的递归删除
SQLite数据库示例: **我不创建数据库,它是Android书签数据库,我使用contentproviders访问它 **据我在一些搜索后了解,SQLite不支持外键约束,但触发器是可能的- 文件夹列->0=不是文件夹(false),1=文件夹(true) PARENTcolumn->保存其文件夹的IDJava 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
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,您在编写它时刚刚发现:)太棒了!在做了一些改变后,这应该会起作用。非常感谢。