【问题标题】:Get all rows from SQLite从 SQLite 获取所有行
【发布时间】:2012-04-11 17:43:03
【问题描述】:

我一直在尝试从 SQLite 数据库中获取所有行。但是我从以下代码中只得到了最后一行。

FileChooser 类:

public ArrayList<String> readFileFromSQLite() {

  fileName = new ArrayList<String>();

  fileSQLiteAdapter = new FileSQLiteAdapter(FileChooser.this);
  fileSQLiteAdapter.openToRead();
  cursor = fileSQLiteAdapter.queueAll();

  if (cursor != null) {
    if (cursor.moveToFirst()) {
      do {
        fileName.add(cursor.getString(cursor.getColumnIndex(FileSQLiteAdapter.KEY_CONTENT1)));
      } while (cursor.moveToNext());

    }
    cursor.close();
  }

  fileSQLiteAdapter.close();
  return fileName;
}

FileSQLiteAdapter 类:

public Cursor queueAll() {
  String[] columns = new String[] { KEY_ID, KEY_CONTENT1 };

  Cursor cursor = sqLiteDatabase.query(MYDATABASE_TABLE, columns, null,
                null, null, null, null);
  return cursor;
}

请告诉我我的错误在哪里。欣赏。

【问题讨论】:

  • cursor.getCount() 的值是多少?
  • @Anirudh 我不明白。你能帮我解释一下吗?
  • 你能把这条语句放在你的代码中吗 - Log.d("TAG","Retrieved rows - " + cursor.getCount());告诉我你看到了什么价值?那就是游标检索到的行数。在 queueAll() 方法中返回光标之前执行此操作。
  • @Anirudh 如果我在 queueAll() 之前执行此操作,它将得到 NullPointerException。如果我在 cursor = fileSQLiteAdapter.queueAll(); 之后执行它,它将得到 0。

标签: android sqlite


【解决方案1】:

尝试:

Cursor  cursor = db.rawQuery("select * from table",null);

List&lt;String&gt;

if (cursor.moveToFirst()) {
  while (!cursor.isAfterLast()) {
    String name = cursor.getString(cursor.getColumnIndex(countyname));

    list.add(name);
    cursor.moveToNext();
  }
}

【讨论】:

  • 结果一样,只得到最后一行。
  • 打印cursor.getCount(); 结果呢?
  • 我刚试过。 cursor.getCount() 的结果是 1,可能是插入数据时出现问题。
  • 然后它的问题与您的数据库首先检查并使用sqlite browser
  • 如果需要,我会自己使用这个解决方案。但是,我正在做while (!cursor.isAfterLast())
【解决方案2】:

使用Android的内置方法

如果您想要每一列和每一行,那么只需将null 传递给SQLiteDatabase columnselection 参数。

Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null, null);

更多详情

其他答案使用rawQuery,但您可以使用Android 内置的SQLiteDatabasequerydocumentation 表示您只需将 null 传递给 selection 参数即可获取所有行。

selection 传递 null 将返回给定表的所有行。

虽然您也可以为column 参数传入null 以获取所有列(如上面的单行),但最好只返回您需要的列。 documentation

columns 传递 null 将返回所有列,不鼓励这样做以防止从存储中读取不会使用的数据。

示例

SQLiteDatabase db = mHelper.getReadableDatabase();
String[] columns = {
        MyDatabaseHelper.COLUMN_1,
        MyDatabaseHelper.COLUMN_2,
        MyDatabaseHelper.COLUMN_3};
String selection = null; // this will select all rows
Cursor cursor = db.query(MyDatabaseHelper.MY_TABLE, columns, selection,
        null, null, null, null, null);

【讨论】:

    【解决方案3】:

    这与其他解决方案几乎相同,但我认为查看实现相同结果的不同方法并稍微解释一下可能会很好:

    可能你在调用 DBHandler 时已经初始化了表名字符串变量,所以它会是这样的;

    private static final String MYDATABASE_TABLE = "anyTableName";
    

    然后,无论您在哪里尝试检索所有表行;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("select * from " + MYDATABASE_TABLE, null);
    
    List<String> fileName = new ArrayList<>();
    if (cursor.moveToFirst()){
       fileName.add(cursor.getString(cursor.getColumnIndex(COLUMN_NAME)));
       while(cursor.moveToNext()){
          fileName.add(cursor.getString(cursor.getColumnIndex(COLUMN_NAME)));
       }
    }
    cursor.close();
    db.close();
    

    老实说,有很多方法可以做到这一点,

    【讨论】:

      【解决方案4】:

      我一直在研究同样的问题!我认为您的问题与您识别用于填充返回的 ArrayList 的变量的位置有关。如果您在循环中定义它,那么它将始终引用数据库中表中的最后一行。为了避免这种情况,您必须在循环之外识别它:

      String name;
      if (cursor.moveToFirst()) {
      
              while (cursor.isAfterLast() == false) {
                  name = cursor.getString(cursor
                          .getColumnIndex(countyname));
      
                  list.add(name);
                  cursor.moveToNext();
              }
      }
      

      【讨论】:

      • 这对您的回答有何不同或更有帮助?
      【解决方案5】:

      更新queueAll()方法如下:

      public Cursor queueAll() {
      
           String selectQuery = "SELECT * FROM " + MYDATABASE_TABLE;
           Cursor cursor = sqLiteDatabase.rawQuery(selectQuery, null);
      
           return cursor;
      }
      

      更新readFileFromSQLite()方法如下:

      public ArrayList<String> readFileFromSQLite() {
      
          fileName = new ArrayList<String>();
      
          fileSQLiteAdapter = new FileSQLiteAdapter(FileChooser.this);
          fileSQLiteAdapter.openToRead();
      
          cursor = fileSQLiteAdapter.queueAll();
      
          if (cursor != null) {
              if (cursor.moveToFirst()) {
                  do 
                  {
                      String name = cursor.getString(cursor.getColumnIndex(FileSQLiteAdapter.KEY_CONTENT1));
                      fileName.add(name);
                  } while (cursor.moveToNext());
              }
              cursor.close();
          }
      
          fileSQLiteAdapter.close();
      
          return fileName;
      }
      

      【讨论】:

        【解决方案6】:
        Cursor cursor = myDb.viewData();
        
                if (cursor.moveToFirst()){
                      do {
                         String itemname=cursor.getString(cursor.getColumnIndex(myDb.col_2));
                         String price=cursor.getString(cursor.getColumnIndex(myDb.col_3));
                         String quantity=cursor.getString(cursor.getColumnIndex(myDb.col_4));
                         String table_no=cursor.getString(cursor.getColumnIndex(myDb.col_5));
        
                         }while (cursor.moveToNext());
        
                        }
        
                        cursor.requery();
        

        【讨论】:

          【解决方案7】:
          public List<String> getAllData(String email)
          {
          
              db = this.getReadableDatabase();
              String[] projection={email};
          
              List<String> list=new ArrayList<>();
          
              Cursor cursor = db.query(TABLE_USER, //Table to query
                      null,    //columns to return
                      "user_email=?",        //columns for the WHERE clause
                      projection,        //The values for the WHERE clause
                      null,       //group the rows
                      null,       //filter by row groups
                      null);
              //  cursor.moveToFirst();
          
              if (cursor.moveToFirst()) {
                  do {
          
                      list.add(cursor.getString(cursor.getColumnIndex("user_id")));
                      list.add(cursor.getString(cursor.getColumnIndex("user_name")));
                      list.add(cursor.getString(cursor.getColumnIndex("user_email")));
                      list.add(cursor.getString(cursor.getColumnIndex("user_password")));
                      // cursor.moveToNext();
          
                  } while (cursor.moveToNext());
              }
              return list;
          }
          

          【讨论】:

          • 欢迎在 Stack Overflow 上发帖。请尝试在答案中添加解释。提示和改进:确保游标不为空,在 finally 块中关闭()游标,只写 while(cursor.moveToNext()) {...},不需要 if-do-while。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-12
          • 2019-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多