神马笔记 版本1.8.0——删除笔记/文件夹·代码篇

一、目标

完成神马笔记管理功能的最后一块拼图——删除文件/文件夹。

二、体验地址

神马笔记最新版本下载:【神马笔记 版本1.8.0——删除笔记/文件夹功能.apk

三、功能设计

1. 实现删除功能

删除功能包括以下几个操作

  1. 删除到最近删除
  2. 最近删除恢复到原来位置
  3. 最近删除彻底删除笔记/文件夹

删除及恢复操作,实际上是一个移动操作。只是移动到最近删除,或者从最近删除移动到原来位置。

彻底删除操作则将数据从数据记录中移除,并且删除相关的文件。

2. 处理最近删除的可见性

另外需要处理的一个问题时当笔记/文件夹位于最近删除时,是否可见?

位置最近删除是否可见?
搜索是。搜索结果包括最近删除的笔记/文件夹。
我的笔记否。已经移动到最近删除
最近项目否。
最近删除是。只显示删除的笔记/文件夹。
标签否。
个人收藏否。隐藏位于最近删除的文件夹,恢复后重新显示。

四、实现过程

1. 删除到最近删除

public boolean trash() {
    if (this.isTrash()) {
        return false;
    }

    if (entry == null) {
        return false;
    }

    String parentId = ROOT_TRASH;
    if (this.getParent().equals(parentId)) {
        return false;
    }

    // set deleted now
    this.setDeleted(DateTime.now());

    // set name
    String name = RecordUtils.getName(context, entry, parentId, true);
    if (this.isAlias()) {
        entry.setAlias(name);
    } else {
        entry.setName(name);
    }

    // set ancestor for recover
    entry.setAncestor(entry.getParent());

    // set parent
    entry.setParent(parentId);

    return true;
}
  1. 最近删除中寻找新的名字,避免重名
  2. 记录原来的位置,以进行恢复操作
  3. 设置新的位置——最近删除

2. 从最近删除恢复

public boolean recover() {
    if (!this.isTrash()) {
        return true;
    }

    if (entry == null) {
        return true;
    }

    String parentId = entry.getAncestor().orElse("");

    // check parent exist or not
    if (!TextUtils.isEmpty(parentId)) {
        if (!parentId.equals(ROOT_NOTE)) {
            RecordEntity parent = RecordEntity.create(parentId).orElse(null);
            parentId = (parent == null || parent.isTrash())? "": parent.getId();
        }
    }

    // if parent is not exist, we move record to root
    if (TextUtils.isEmpty(parentId)) {
        parentId = ROOT_NOTE;
    }

    // set deleted null
    this.setDeleted(null);

    // set name
    String name = RecordUtils.getName(context, entry, parentId, true);
    if (this.isAlias()) {
        entry.setAlias(name);
    } else {
        entry.setName(name);
    }

    // set ancestor null
    entry.setAncestor(null);

    // set parent
    entry.setParent(parentId);

    return true;

}
  1. 检查原来的位置是否存在,并且不是位于最近删除
  2. 寻找新的名字,避免恢复时重名
  3. 清空恢复位置,设置回原来位置

3. 彻底删除

public List<RecordEntity> delete() {
    final RecordTable table = getManager().obtainTable(RecordTable.class);
    if (!this.isDirectory()) {

        // remove data
        table.remove(this.entry);

        // to entity
        return Arrays.asList(this);

    } else {

        // filter descendant of this
        final String parentId = this.getId();
        List<RecordEntry> list = table.getList().stream()
                .filter(e -> RecordUtils.isDescendantOf(table, e, parentId))
                .collect(Collectors.toList());

        // remove data
        for (RecordEntry e : list) {
            table.remove(e);
        }

        // to entity
        return list.stream()
                .map(e -> new RecordEntity(getContext(), e.getId(), e))
                .collect(Collectors.toList());
    }
}
final void executeDelete(RecordEntity entity) {

    // delete from record database
    final List<RecordEntity> list = entity.delete();

    // delete database entry
    {
        FavoriteEntity favorite = FavoriteEntity.obtain();

        for (RecordEntity e : list) {
            String id = e.getId();

            if (e.isDirectory()) {

                // delete favorite
                favorite.delete(id);

            } else {

                // delete recent
                RecentEntity.delete(id);

                // delete saved state
                SavedStateEntity.delete(id);

                // delete image
                ImageEntity.deleteByDocument(id);
            }

        }
    }

    // delete file system files
    for (RecordEntity e : list) {
        if (e.isDirectory()) {
            continue;
        }

        CompletableFuture.runAsync(() -> {
            try {
                // delete snapshot
                File file = e.getSnapshot();
                if (file.exists()) {
                    FileUtils.forceDelete(file);
                }

                // delete note document
                file = e.getFile();
                if (file.exists()) {
                    FileUtils.forceDelete(file);
                }
            } catch (IOException e1) {

            }
        });
    }
}

删除文件夹时,需要删除包含的子文件夹和笔记。

我们通过遍历所有笔记数据,判断是否是当前文件夹的后代来决定是否删除。

最后返回需要删除的笔记/文件夹列表。

彻底删除需要删除以下相关数据。

  1. 笔记记录
  2. 个人收藏,仅文件夹
  3. 最近项目,仅笔记
  4. 笔记状态,仅笔记
  5. 图片记录,仅笔记

另外,还需要删除笔记相关的文件。

  1. 笔记截图
  2. 笔记文件夹

4. 处理文件夹收藏

public EntityList toList() {
    return new EntityList(new FavoriteEntity(this).getList().stream()
            .filter(e -> !e.isTrash())
            .collect(Collectors.toList()));
}

当文件夹收藏位于最近删除时,隐藏显示,恢复后重新显示。

增加一个过滤接口,只显示非最近删除文件夹。

五、Finally

~撩乱春愁如柳絮~悠悠梦里无寻处~

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值