2012-04-11 102 views
34

我一直试图从SQLite数据库获取所有行。但是,我只从下面的代码中得到最后一行。从SQLite获取所有行

文件选择器类:

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; 
} 

请告诉我哪里是我的不正确。欣赏。

+0

什么cursor.getCount()的价值呢? – Anirudh 2012-04-11 17:50:08

+0

@Anirudh我不明白。你能为我解释一下吗? – Yoo 2012-04-12 04:19:28

+0

你可以把这个语句放在你的代码中 - Log.d(“TAG”,“Retrieved rows - ”+ cursor.getCount());并告诉我你看到了什么价值?这就是光标检索到的行数。在将游标返回到queueAll()方法之前执行此操作。 – Anirudh 2012-04-12 22:49:32

回答

69

尝试:

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

List<String>

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

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

结果是一样的,它只得到最后一行。 – Yoo 2012-04-12 04:18:49

+0

print'cursor.getCount();'结果怎么样? – 2012-04-12 05:31:21

+0

我刚试过。 cursor.getCount()的结果是1.也许问题出现在插入数据时。 – Yoo 2012-04-12 05:36:06

2

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

String name; 
if (cursor.moveToFirst()) { 

     while (cursor.isAfterLast() == false) { 
      name = cursor.getString(cursor 
        .getColumnIndex(countyname)); 

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

这是如何让你的回答有任何不同或更有帮助的? – Shubham 2016-03-17 05:04:58

2

这几乎是相同的解决方案为别人,但我想这可能是很好看实现相同的结果的不同方式,解释一下:

大概你有表名字符串变量在你调用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(); 

老实说,大概有这样做的方法很多,

0

更新queueAll()方法如下:

更新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; 
} 
2

其他答案使用rawQuerydocumentation对于SQLiteDatabase表示,您可以将null传递给查询的selection参数以获取所有行。

selection传递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); 
0
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();