【问题标题】:What to do with Cursor after a SQLite query?SQLite 查询后如何处理光标?
【发布时间】:2011-07-21 20:42:52
【问题描述】:

这是我第一次使用数据库,我不确定它是如何工作的。我创建了数据库并进行了返回游标的查询,然后......现在呢?什么是光标,真的吗?我可以使用它来浏览我的数据还是必须将其放入 ArrayList 或 ListActivity 或其他什么?

【问题讨论】:

    标签: android database sqlite cursor


    【解决方案1】:

    您需要迭代光标以获取结果。

    使用cursor.moveToFirst() 和/或cursor.moveToNext()(带有while 循环)。然后可以使用 getX() 方法,如cursor.getInt()cursor.getString()

    例如,您期望从查询中得到一个结果:

    if (cursor.moveToFirst()) {
        String name = cursor.getString(cursor.getColumnIndex('NAME'));
        int age = cursor.getInt(cursor.getColumnIndex('AGE'));
    } else {
        // oops nothing found!
    }
    

    【讨论】:

    • 这是查看数据库中有多少特定记录的最佳方法吗?
    【解决方案2】:

    首先调用 cursor.moveToFirst()。每次调用 cursor.moveToNext() 时,它都会移动到下一行。确保在完成光标操作后调用 cursor.deactivate() ,否则日志 cat 中会出现错误。

    【讨论】:

      【解决方案3】:

      遍历返回的 Cursor 实例

      public List<Object[]> cursorToTableRows(Cursor cursor) {
              List<Object[]> result = new ArrayList<Object[]>(cursor.getCount());
      
              cursor.move(0);
              cursor.moveToNext();
              while (cursor.isAfterLast() == false) {
                  Object[] tableRow = new Object[cursor.getColumnCount()];
                  for(int i=0; i<cursor.getColumnNames().length; i++) {
                      int columnIndex = cursor.getColumnIndex(cursor.getColumnName(i));
                      String columnValue = cursor.getString(columnIndex);
                      tableRow[i] = columnValue;
                  }
                  result.add(tableRow);
                  cursor.moveToNext();
              }
      
              cursor.close();
      
              return result;
          }
      

      然后创建所需的对象。

      public List<Vehicle> getVehicles() {
              List<Vehicle> vehicles = new ArrayList<Vehicle>();
              Cursor cursor = null;
              List<Object[]> objects = cursorToTableRows(cursor);
              for(Object[] row : objects) {
                  int i=0;
                  Vehicle vehicle = new Vehicle(row[i++].toString(), row[i++].toString()));
                  vehicles.add(vehicle)
              }
              return vehicles;
          }
      

      【讨论】:

        【解决方案4】:

        来自Developer.android:此接口提供对数据库查询返回的结果集的随机读写访问。

        换句话说:查询返回一组由游标表示的数据。首先,您需要确保您有一个有效的光标(非空),然后尝试将其移动到数据集中的所需位置(使用 moveToXXX 方法)。为了获取游标指向的数据,请使用 getXXX 方法。完成使用后,请确保调用 close 以释放资源。

        【讨论】:

          【解决方案5】:

          根据this link,您似乎可以使用以下方式遍历查询返回:

          cursor.next();
          

          并在您要使用的位置获取数据:

          cursor.getString(0)
          

          【讨论】:

            【解决方案6】:

            成功设置光标后,您通常希望以某种形式将其显示到视图中。

            查看以下答案,了解使用 Cursor Adapter 将新创建的 Cursor 与所需的 XML 视图配对的详细但简单的示例:

            https://stackoverflow.com/a/20532937/293280

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2023-03-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多