Java Android海量数据库创建

Java Android海量数据库创建,java,android,sql,database,performance,Java,Android,Sql,Database,Performance,伙计们,这是一个大问题 我目前正在开发一个应用程序,它涉及到一个大型数据库的创建。 它所做的是扫描整个设备以查找任何类型的媒体文件,并将其添加到数据库中(通过某些文件扩展名进行过滤)。 它目前的做法是使用递归函数扫描设备的文件夹,每次它找到一个实际上是文件而不是目录的文件,并与我选择的文件扩展名匹配时,它都会将该文件的路径添加到以前创建的仅包含字符串的ArrayList中。 这是在异步任务中实现的,因此它是在后台完成的。 该任务完成后,它会将ArrayList传递给负责将这些文件添加到数据库的另

伙计们,这是一个大问题
我目前正在开发一个应用程序,它涉及到一个大型数据库的创建。 它所做的是扫描整个设备以查找任何类型的媒体文件,并将其添加到数据库中(通过某些文件扩展名进行过滤)。
它目前的做法是使用递归函数扫描设备的文件夹,每次它找到一个实际上是文件而不是目录的文件,并与我选择的文件扩展名匹配时,它都会将该文件的路径添加到以前创建的仅包含字符串的ArrayList中。
这是在异步任务中实现的,因此它是在后台完成的。
该任务完成后,它会将ArrayList传递给负责将这些文件添加到数据库的另一个AsyncTask。出于简单的原因,我只选择了文件的路径、名称和存储在每个条目标记中的标题(简单的sqlite内容),并在另一个活动中的列表视图中通过光标适配器等显示标题(在我的情况下,这不是一个真正的问题)。
现在它工作得很好,不会崩溃或返回任何不好的结果(我现在正在测试OnePlus 1)。
但我的手机上有一个很大的音乐库(大约5400首歌曲),几乎填满了我的全部存储空间。出于某种未知的原因,我提到的扫描任务(使用ArrayList)在3000个文件左右停止,并将ArrayList传递给第二个任务,这显然不是我想要的。
我的猜测是,可能存在一个大的性能问题,而使用ArrayList并不是解决这个问题的最佳方法。它可能适用于数量低于3000但高于3000的文件,这也是必需的…

你们有什么建议?我的方法缺少什么,还是我必须尝试完全不同的方法?

您不需要扫描文件夹(可能也不需要创建媒体文件数据库),只需使用class即可

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

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

private List getplaylist(){
ContentResolver解析器=getContentResolver();
Uri Uri=MediaStore.Audio.Playlists.EXTERNAL\u CONTENT\u Uri;
String[]columns={u ID,NAME};
游标播放列表=resolver.query(uri、列、null、null、null);
列表结果=新建ArrayList();
如果(播放列表==null){
返回结果;
}
光标;
for(布尔值hasItem=playLists.moveToFirst();hasItem;hasItem=playLists.moveToNext()){
long id=playLists.getLong(playLists.getColumnIndex(_id));
字符串名称=playLists.getString(playLists.getColumnIndex(名称));
cursor=resolver.query(MediaStore.Audio.Playlists.Members.getContentUri(“外部”,id),
新字符串[]{MediaStore.Audio.Playlists.Members.TITLE,MediaStore.Audio.Playlists.Members.ARTIST,
MediaStore.Audio.Media.DATA,MediaStore.Audio.Playlists.Members.PLAY_ORDER},null,null,null
);
int-songsunt=cursor.getCount();
结果。添加(新播放列表)(
身份证件
名称
松松;
cursor.close();
}
playLists.close();
返回结果;
}

从概念上讲,您可以在获取固定数量的文件(例如500个)的同时重复这两项任务。我认为您可以将音乐路径保存到数据库表,而不是使用。。。。要检索此链接,但随后我会遇到问题,无法拾取我离开的位置,当然我可以保存路径以备以后使用,但随后我无法从那里启动递归函数以返回根。假设在函数
abc()
中有一个循环正在遍历文件系统。在循环中添加一个计数器,当计数器达到500时,调用一个函数,例如
xyz()
,并将数组列表传递给该函数。
xyz
函数将此arraylist传递给另一个异步任务并执行它。一旦控制从
xyz
返回到
abc
功能,重置计数器并继续遍历。
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;
}