【问题标题】:Android CursorLoader with selection and selectionArgs[]带有 selection 和 selectionArgs[] 的 Android CursorLoader
【发布时间】:2015-03-21 09:48:04
【问题描述】:

我使用Loader 代替RecyclerView.Adapter 来列出项目。我想列出数据库表中的特定项目。所以我做到了:

public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String selectionArgs1[]={"1","13","14"}; 
    String selection1 = DatabaseOpenHelper.COLUMN_ID + " in (";
    for (int i = 0; i < selectionArgs1.length; i++) {
                selection1 += "?, ";
    }
    selection1 = selection1.substring(0, selection1.length() - 2) + ")";
    String[] projection1 =...
    return new CursorLoader(getActivity(),StudentContentProvider.CONTENT_URI1, projection1, selection1,selectionArgs1, null);
}

通常我将null,nullselectionselectionArgs 但在这里,我列出了带有特定IDs 的项目。当新项目添加到表中并且我想列出它时会出现问题。我返回的cursor 不知道新项目,因为我提供了 3 个特定项目,所以它只检测这 3 个项目何时发生变化。

当有新项目添加了一些ID并且我也想列出它时如何列出?我应该将数据库中的所有项目投影到RecyclerView.Adapter 并在onBindViewHolder() 中过滤IDs 吗?

【问题讨论】:

  • 您需要一个“通知”自定义内容提供程序,请参阅实现内容提供程序时的 ContentResolver.notifyChange() 用法
  • @pskink 是的,我有,它会通知,但我的光标没有改变,因为我在光标中限制了 IDs。如果仅更改特定项目而不是添加新项目时,则更改光标。
  • 所以在插入新行时也要调用 notifyChange...
  • @pskink 它被调用,问题是cursor 没有列出所有项目,所以它不会更改列表,除非我再次在选择中添加新的IDs。因为cursor 即使收到通知也不知道有新项目,因为我用一些IDs 限制了cursor

标签: android android-cursorloader android-loader android-recyclerview android-database


【解决方案1】:

由于我已将IDs 限制在cursor 中,因此仅在特定项目发生更改时才更改,而不是在添加新项目时更改。我在onLoadFinished() 上做了一个技巧来创建新的cursor 并交换那个新的光标。因此,当有变化时,我会再次使用 selectionselectionArgs 获得新光标:

public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
   switch (loader.getId()) {
       case LOADER_ID:{
          String selectionArgs1[]={...}; 
          String selection1 = DatabaseOpenHelper.COLUMN_ID + " in (";
          for (int i = 0; i < selectionArgs1.length; i++) {
                selection1 += "?, ";
          }
          selection1 = selection1.substring(0, selection1.length() - 2) + ")";
          String[] projection1 =...              
          mDataset1 = getActivity().getContentResolver().query(StudentContentProvider.CONTENT_URI1, projection1, selection1, selectionArgs1, null);
          mAdapter.swapCursor(mDataset1);
          break;
      }
}

【讨论】:

  • 我不明白为什么你需要一些特定的 id,然后你会惊讶于你的加载器没有看到新的 id,所以使用基于其他字段而不是 id 的选择
  • @pskink 我不能,因为我的数据库设计就像这里一样:stackoverflow.com/questions/28946355/…。我有 2 张桌子,首先我从 student_course 桌子(同一班级的所有学生)中得到 student IDs,然后我用 student IDs 显示学生
  • @pskink 如果你有我想听的建议
  • 你的加载器应该检索哪些学生?
  • @pskink 来自特定班级(数学..)的学生。班级很多,学生也很多。一名学生可能需要上课。
猜你喜欢
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多