【问题标题】:What is the best way to build folders compact tree?构建文件夹紧凑树的最佳方法是什么?
【发布时间】:2016-09-29 02:50:54
【问题描述】:

我正在制作一个已定义文件列表的浏览器。 我想压缩空文件夹(就像基于想法的 IDE 通常可以做的那样)

最初我有一个文件列表(我从 MediaStore 获得):

folder1/folder2/folder3/file1.mp3
folder1/folder2/folder3/file2.mp3
folder1/file3.mp3

我希望我的浏览器有这样的结构:

folder1
       -folder2/folder3
                      -file1.mp3
                      -file2.mp3
       -file3.mp3

我是怎么做到的:

当我第一次从 MediaStore 获取文件时,我会在数据库中创建一个表:

id name parent_id has_songs
0  folder1 -1 1
1  folder2 0 0
2  folder3 1 1

当浏览器每次显示文件夹时,它都会向数据库发出请求。 然后我开始检查里面的文件夹(每次检查都需要向数据库提出额外的请求):如果一个文件夹没有歌曲并且只有一个子文件夹,那么压缩它们,然后检查下一个和下一个。

对于上面的示例,如果我想查看文件夹 1 的“内部”,它会向本地数据库发出 3 个请求:

1. Get list of all folders (Make a request to the db here)
2. Check folder2 has one subfolder and doesn't have songs (Make a request to the db here)
3. Check folder3 has one subfolder and doesn't have songs (Make a request to the db here)

1.这是实现这一点的最佳方式吗?

2。是否对性能至关重要 在用户点击时向本地数据库发出如此多的请求?

【问题讨论】:

  • 你可以看到这个库:github.com/bmelnychuk/AndroidTreeView
  • @licon 使用这个库不会改变任何事情,无论如何我必须对数据库执行相同的请求来扩充库树。

标签: java android algorithm sqlite database-schema


【解决方案1】:

这取决于您的环境。 :)

一般: 如果文件列表相对较小,则值得考虑是否可以将所有信息保存在内存中。如果您有足够的可用内存,这可能是最好的解决方案,因为它比访问数据库要快得多。我曾经创建一个实际代表目录和文件结构的对象,然后视图端根据用户需求打开和关闭块。 (全部打开、全部关闭等)

这是实现此功能的最佳方式吗? 环境是关键。正如我所提到的,这可能是一个很好的解决方案。如果您使用的是远程(或更高级的 [SQLite is able to do it])数据库服务器,考虑创建一个包含子计数的视图也是一件好事。 (或者只是更改生成的表,引入“inside_dir_count”字段。)这样您就可以获取整个路径。

在用户点击时向本地数据库发出如此多的请求对性能至关重要吗? 这是对您在此处表示的数据库的一个相对较小的请求,如果它真的取决于用户的点击,这是一个很好的解决方案。提到的本地数据库应该很快就会响应。这个动作不是每秒会发生 1000 次的事情,所以在我个人看来,它是一个很好的解决方案,但在所有方面都有改进的余地。

【讨论】:

  • 非常感谢马克。我问了这个问题,以防我犯了一个巨大的错误而没有看到。现在我对自己的决定更有信心了。
猜你喜欢
  • 2010-12-01
  • 2011-08-04
  • 2017-05-29
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多