我怎样才能持久化 ORDER BY CASE WHEN 改变的状态?

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

我在这个网站上得到了关于如何表达 ORDER BY CASE 的答案,而且效果很好。

喜欢下面

道:

@Query("SELECT * FROM decks ORDER BY " +
        "CASE WHEN :parameter = 0 THEN dateTime END ASC, " +
        "CASE WHEN :parameter = 1 THEN dateTime END DESC, " +
        "CASE WHEN :parameter = 2 THEN deckName END ASC, " +
        "CASE WHEN :parameter = 3 THEN deckName END DESC")
List<Deck> getAllDecksByOrder(int parameter);

但是当我按下 AVD 的运行应用程序按钮时,用户选择回收器视图的顺序返回到默认顺序(在这种情况下参数 = 0 虽然我没有定义它)。

我如何保持用户更改的订单状态(onOptionsItemSelected)?我不知道如何处理这个。

下面摘录代码

谢谢。

资料库

public class DeckRepository {
    private final MutableLiveData<List<Deck>> searchResults
            = new MutableLiveData<>();
    private List<Deck> results;
    private final DeckDao deckDao;
    .

    public DeckRepository(Application application){
        RoomDatabase db;
        db = RoomDatabase.getDatabase(application);
        deckDao = db.deckDao();
    }

    Handler handler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg){
            searchResults.setValue(results);
        }
    };

    public void getAllDecksByOrder(int parameter){
        ExecutorService executor = Executors.newSingleThreadExecutor();
        executor.submit(() ->{
            results = deckDao.getAllDecksByOrder(parameter);
            handler.sendEmptyMessage(0);
        });
        executor.shutdown();
    }


    public MutableLiveData<List<Deck>> getSearchResults(){
        return searchResults;
    }
}

mainViewModel

public class MainViewModel extends AndroidViewModel{
    private DeckRepository repository;
    private MutableLiveData<List<Deck>> searchResults;

    public MainViewModel(Application application){
        super(application);
        repository = new DeckRepository(application);
        searchResults = repository.getSearchResults();
    }

    public MutableLiveData<List<Deck>> getSearchResults(){
        return searchResults;
    }

    public void getAllDecksByOrder(int parameter){
        repository.getAllDecksByOrder(parameter);
    }
}

主要片段

public class MainFragment extends Fragment implements NoticeDialogFragment.NoticeDialogListener {

    private MainViewModel mViewModel;
    private DeckListAdapter adapter;  
    int parameter;

    .
    .

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.order_dateTime_ASC:  {
                mViewModel.getAllDecksByOrder(0);
                return true;
            }

            case R.id.order_dateTime_DESC:  {
                mViewModel.getAllDecksByOrder(1);
                return true;
            }

            case R.id.order_question_ASC:  {
                mViewModel.getAllDecksByOrder(2);
                return true;
            }

            case R.id.order_question_DESC:  {
                mViewModel.getAllDecksByOrder(3);
                return true;
            }
            default:
                return super.onOptionsItemSelected(item);
        }
    }

   .
   .

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mViewModel = new ViewModelProvider(this).get(MainViewModel.class);
        mViewModel.getAllDecksByOrder(parameter);
        mViewModel.getSearchResults().observe(getViewLifecycleOwner(), new Observer<List<Deck>>() {
            @Override
            public void onChanged(@Nullable final List<Deck> decks) {
                adapter.setDeckList(decks);
            }
        });  
    }
   .
   . 
}

实体

@Entity(tableName = "decks")
public class Deck {

    @PrimaryKey(autoGenerate = true)
    @NonNull
    @ColumnInfo(name = "deckId")
    private int id;

    @ColumnInfo(name = "deckName")
    private String name;

    @ColumnInfo(name = "deckListCount")
    private int listCount;

    private LocalDateTime dateTime;

    public Deck(String name, int listCount, LocalDateTime dateTime){
        this.name = name;
        this.listCount = listCount;
        this.dateTime = dateTime;
    }
.
.
}
java android android-recyclerview sql-order-by android-room
1个回答
0
投票

我在 roomdatabase 中按常规方式计算出来 (在这种情况下,在 Entity 中为参数添加字段。 更新参数并在 Livedata 的观察中检索它。)。

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