如何在大型本地数据库中快速搜索查询,寻找像其他离线音乐应用程序一样的“搜索”功能?

问题描述 投票:0回答:1

有没有人给我任何提示或指导我应该使用什么算法在大型数据库(音乐或歌曲几乎 1000x10)中进行搜索查询功能,到目前为止我尝试过的是线性搜索(时间 O(n) 使用迭代进行过滤查询)这会消耗太多内存,而且在给定查询上搜索速度太慢,这是代码的一部分:-

关于活动 - >

  SearchViewModel searchViewModel = new ViewModelProvider(this).get(SearchViewModel.class);

        songAdapter = new SongAdapter(getApplicationContext(),new ArrayList<>());
        layoutBinding.searchRecyclerviewForSongs.setAdapter(songAdapter);

        layoutBinding.searchEdittextBox.addTextChangedListener(new TextWatcher() {

            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {
               // task.searchFilterData(editable.toString());

                searchViewModel.getResultList(SearchHome.this, editable.toString())
                        .observe(SearchHome.this,
                                new Observer<List<SongsPOJO>>() {
                            @Override
                            public void onChanged(List<SongsPOJO> songsPOJOS) {
                                Log.i(TAG, "onChanged: searchViewModel->" + songsPOJOS.size());
                                // Update UI with the new data
                                songAdapter.clearSongData(songsPOJOS);
                            }
                        });
            }
        });

我使用 editText 作为带有 textWatcher 的查询可搜索框 -> afterTextChanged(可编辑可编辑) 在这里,我使用 viewmodel 并将搜索查询传递到后台并在 ui 上返回结果

ViewModel 代码->



    public MutableLiveData<List<SongsPOJO>> getResultList(Context context,String _searchTxt) {

        myapp = (App) context.getApplicationContext();
        service = myapp.getExecutorService();
        service.submit(new Runnable() {
            @Override
            public void run() {

                List<SongsPOJO> filteredList = filteredData(context, _searchTxt);
                setList.postValue(filteredList);

            }
        });

        return setList;
    }


  private List<SongsPOJO> filteredData(Context context,String _query){
        // Filter logic here:-

        List<SongsPOJO> filterList = new ArrayList<>();

        // Projection for the columns you want to retrieve
        String[] projection = {
                MediaStore.Audio.Media._ID,
                MediaStore.Audio.Media.TITLE,
                // Add other columns you need
        };

        // Selection criteria for the query
        String selection = MediaStore.Audio.Media.TITLE + " LIKE ?";
        String[] selectionArgs = new String[]{"%" + _query + "%"};

        // Sorting order for the results
        String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";

        // Perform the query
        ContentResolver contentResolver = context.getContentResolver();
        Cursor cursor = contentResolver.query(
                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                projection,
                selection,
                selectionArgs,
                sortOrder
        );

        // Check if the cursor is not null
        if (cursor != null) {
            try {
                // Use the cursor to retrieve data
                while (cursor.moveToNext()) {
                    String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));

                    // Use a single list for both data loading and filtering
                    SongsPOJO songsPOJO = new SongsPOJO();
                    songsPOJO.setSongName(title);
                    filterList.add(songsPOJO);
                    
                }

            } finally {
                // Close the cursor when done
                cursor.close();
            }
        }
            return filterList;
    }

如果我以错误的方式处理这个问题,也请告诉我。

我想要实现的是像其他离线音乐应用程序一样的搜索功能吗?当一个人输入任何歌曲名称时,相关的关键字歌曲就会立即出现在 recyclerview 或 UI 上,我的意思是太快了,或者至少引导我朝正确的方向解决上述问题?预先感谢!

java android-music-player linear-search local-database
1个回答
0
投票

对于快速搜索问题,

Binary Search
提出了Log(N)的时间复杂度。但请记住,它需要应用排序的数据。

这促使您选择排序算法。 选择排序算法取决于一些因素,例如:

  1. 数据的类型(是“在正常视图中”部分排序还是完全未排序)。
  2. 有多大(物品数量)。

认为看一下二分查找会有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.