首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android海量数据库创建

Android海量数据库创建
EN

Stack Overflow用户
提问于 2015-07-31 20:24:19
回答 1查看 61关注 0票数 2

所以伙计们,这是个大问题

我目前正在开发一个应用程序,其中涉及一个大型数据库的创建。它所做的基本工作是扫描整个设备,寻找任何类型的媒体文件,并将其添加到数据库中(通过特定的文件扩展名过滤)。

它目前的做法是使用递归函数扫描设备的文件夹,每次它找到一个实际上是文件而不是目录的文件,并与我选择的文件扩展名匹配时,它会将该文件的路径添加到之前创建的只包含字符串的ArrayList中。

这是在AsyncTask中实现的,所以它是在后台完成的。

一旦该任务完成,它就会将ArrayList传递给另一个负责将这些文件添加到数据库的AsyncTask。为了简单起见,我只获取了文件的路径、名称和存储在每个条目的标签中的标题(简单的sqlite内容),并通过光标适配器等将标题显示在另一个活动的ListView中(这在我的例子中并不是问题)。

现在它工作得很好,不会崩溃或返回任何不好的东西(我现在正在OnePlus One上测试)。

但我的手机上有一个非常大的音乐库(大约5400首歌曲),几乎填满了我的整个存储空间。出于某种未知的原因,我提到的扫描任务(使用ArrayList)在大约3000个文件时停止,并将ArrayList传递给第二个任务,这显然不是我想要的。

我的猜测是可能会有一个很大的性能问题,使用ArrayList不是解决这个问题的最好方法。它可能适用于低于3000的文件数量,但高于3000也是必要的……

那么你们有什么建议呢?我的方法是否缺少一些东西,或者我必须尝试一些完全不同的东西?

EN

回答 1

Stack Overflow用户

发布于 2015-07-31 20:49:29

你不需要扫描你的文件夹(可能还需要创建媒体文件的数据库),你只需要使用MediaStore

媒体提供程序包含内部和外部存储设备上所有可用媒体的元数据。

例如,这段代码将返回所有可用的音频播放列表

代码语言:javascript
复制
private List<Playlist> getPlayListsList(){
    ContentResolver resolver = getContentResolver();
    Uri uri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
    String[] columns = { _ID, NAME };
    Cursor playLists = resolver.query(uri, columns, null, null, null);

    List<Playlist> result = new ArrayList<>();
    if (playLists == null) {
        return result;
    }

    Cursor cursor;
    for (boolean hasItem = playLists.moveToFirst(); hasItem; hasItem = playLists.moveToNext()) {
        long id = playLists.getLong(playLists.getColumnIndex(_ID));
        String name = playLists.getString(playLists.getColumnIndex(NAME));

        cursor = resolver.query(MediaStore.Audio.Playlists.Members.getContentUri("external", id),
                new String[]{MediaStore.Audio.Playlists.Members.TITLE, MediaStore.Audio.Playlists.Members.ARTIST,
                        MediaStore.Audio.Media.DATA, MediaStore.Audio.Playlists.Members.PLAY_ORDER}, null, null, null
        );

        int songsCount = cursor.getCount();

        result.add( new Playlist(
                id,
                name,
                songsCount));
        cursor.close();
    }
    playLists.close();
    return result;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31746143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档