【问题标题】:Removing rows from an Android SQLite Cursor从 Android SQLite 游标中删除行
【发布时间】:2011-03-15 19:03:50
【问题描述】:

我查询并返回一个结果集,但我需要做一些在 SQLite WHERE 子句中不可能的计算,以确定 ListView 中显示的内容。如何从光标中删除某些行?我知道这与Filter rows from Cursor so they don't show up in ListView 的问题相同,但该答案无济于事。如果没有更简单的方法可以提供示例吗?

【问题讨论】:

    标签: android sqlite cursor


    【解决方案1】:

    它可能会简单地保留光标中的所有行,然后使用自定义适配器在显示时隐藏不需要的行。例如,如果您扩展 CursorAdapter,那么您的 bindView 实现中可能会有类似的内容:

    View v = view.findViewById(R.id.my_list_entry);
    boolean keepThisRow = .......; // do my calculations
    v.setVisibility(keepThisRow ? View.VISIBLE : View.GONE);
    

    【讨论】:

      【解决方案2】:

      应该有更好的方法来做到这一点,但我最终做的是将我想要的每一行的 ID 存储在字符串 ArrayList 中,然后重新查询 where _id IN arraListOfIds.toString(),将方括号替换为括号以适应 SQL 语法。

      // Get all of the rows from the database        
      mTasksCursor = mDbHelper.fetchAllTasks();
      
      ArrayList<String> activeTaskIDs = new ArrayList<String>();
      
      // calculate which ones belong
      // .....
      
      if (!hasCompleted)             
                      activeTaskIDs.add(mTasksCursor.getString(TaskerDBadapter.INDEX_ID));
      
      // requery on my list of IDs
      mTasksCursor = mDbHelper.fetchActiveTasks(activeTaskIDs);
      
      public Cursor fetchActiveTasks(ArrayList<String> activeTaskIDs)
          {
              String inClause = activeTaskIDs.toString();
              inClause = inClause.replace('[', '(');
              inClause = inClause.replace(']', ')');
      
              Cursor mCursor = mDb.query(true, DATABASE_TABLE, columnStringArray(), 
                      KEY_ROWID + " IN " + inClause, 
                      null, null, null, null, null);
      
              if (mCursor != null) { mCursor.moveToFirst(); }
      
              return mCursor;
          }
      

      【讨论】:

        【解决方案3】:
        ContentResolver cr = getContentResolver();
                Cursor groupCur = cr.query(
                        Groups.CONTENT_URI, // what table/content
                        new String [] {Groups._ID, Groups.NAME},    // what columns
                        "Groups.NAME NOT LIKE + 'System Group:%'", // where clause(s)
                        null, // ???
                        Groups.NAME + " ASC" // sort order
                );
        

        上面的“What Columns”部分是您可以告诉光标返回哪些行的地方。使用“null”会全部返回。

        【讨论】:

        • 我没有完全理解这一点,但我认为它不能解决我的问题。我不能使用列名,我需要根据列值进行代码内计算以确定将选择哪些行。
        【解决方案4】:

        我需要做一些计算 在 SQLite WHERE 中是不可能的 子句

        我觉得这很难相信;我的经验是,SQL 可以让你查询几乎任何你需要的东西(除了 SQLite 的分层或递归查询)。如果您需要的某些功能不受支持,您可以使用 sqlite_create_function() 轻松添加它并在您的应用程序中使用它。或者,也许创造性地使用 SELECT 子句可以满足您的需求。

        你能解释一下这些不可能的计算是什么吗?


        编辑:没关系,查看this webpage 显示 sqlite_create_function() 适配器已全部被 Android SQLite 包装器关闭。这很烦人。

        【讨论】:

        • Hmpf,Postgres SQL 可能就足够了,但绝对不是 SQLite... 想想一些 GeoQueries(这对 SQLite 来说是个麻烦)
        猜你喜欢
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多