2012-04-11 101 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();