2012-08-31 136 views
0

我一直在試圖用SQLite數據庫中的數據填充ListView,並且似乎無法弄清楚。我讀過無數的教程和無數的帖子,但我顯然沒有得到關鍵的東西。希望有人能給我一個暗示,爲什麼下面兩段代碼不能一起工作,或者我應該完全看看其他的東西。任何幫助,將不勝感激。我得到的結果是一個關閉的力量。使用SQLite數據庫中的數據填充ListView

方法發起移植ListView對象

public void displayNurseRoster(){ 

    listView = (ListView) findViewById(R.id.list); 

    // create instance of DbCommunicator 
    DbCommunicator rosterView = new DbCommunicator(this); 

    // open instance 
    rosterView.open(); 

    // instantiate SimpleCursorAdapter instance and set value 
    SimpleCursorAdapter cursorAdapter; 
    cursorAdapter = rosterView.getRosterListViewAdapter(this); 

    // close database instance 
    rosterView.close(); 

    // set adapter to listView 
    listView.setAdapter(cursorAdapter); 
} 

方法,返回SimpleCursorAdapter:

public SimpleCursorAdapter getRosterListViewAdapter (Context context) { 

    // method variables 
    int[] to = new int[] {R.id.rosterListLname}; 
    // used ArrayList because of unpredictability of array length 
    List<String> dataArray = new ArrayList<String>(); 
    String[] columns = new String[] {KEY_NURSE_ROWID, KEY_LNAME}; 

    // create cursor 
    Cursor cursor = sqldb.query(NURSE_TABLE, columns, null, null, null, 
      null, KEY_LNAME); 

    int iLname = cursor.getColumnIndex(KEY_LNAME); 

    cursor.moveToFirst(); 

    String result = ""; 

    while(!cursor.isAfterLast()){ 
     result = result 
       + cursor.getString(iLname) + "\n"; 
     dataArray.add(result); 

    } 
    // convert ArrayList to String array for use with SimpleCursorAdapter 
    String [] from = (String[]) dataArray.toArray(); 

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(context, 
      R.layout.edit_roster, cursor, from, to); 

    return adapter; 
} 
+0

仍在研究這個小問題。任何幫助將不勝感激。 – deadEddie

回答

2

好吧,我得到它的工作,並希望分享,以幫助其他人用這個和2掙扎),以獲得有關我的修復的反饋,以防有更多經驗的人有更好的建議。

我真的想在列表視圖中顯示三個項目,所以這裏是工作的代碼。我遇到的問題之一是我擴展了ListActivity,但在另一個StackOverflow帖子中發現,當只有一個列表視圖需要擔心時,這不是一個好主意。

package com.deadEddie.staffingmanagement; 

import android.app.Activity; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 

public class EditRoster extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.edit_roster); 
    displayNurseRoster(); 
} 

public void displayNurseRoster(){ 

    ListView listView = (ListView) findViewById(R.id.list); 

    int[] to = new int[] { 
      R.id.rosterListLname, 
      R.id.rosterListFname, 
      R.id.rosterListMI }; 

    String[] from = new String [] { 
      DbCommunicator.KEY_LNAME, 
      DbCommunicator.KEY_FNAME, 
      DbCommunicator.KEY_MI}; 

    // create instance of DbCommunicator 
    DbCommunicator rosterView = new DbCommunicator(this); 

    // open instance 
    rosterView.open(); 

    // get & manage cursor 
    Cursor cursor = rosterView.getRosterCursor(this); 
    startManagingCursor(cursor); 

    // instantiate cursor adaptor 
    ListAdapter adapter = new SimpleCursorAdapter(this, 
      R.layout.nurse_list, cursor, from, to); 
    cursor.moveToNext(); 

    // set adapter to listView 
    listView.setAdapter(adapter); 
}// displayNurseRoster() 
} 

這是我的DbCommunicator類中的方法。最終導致差異的是我沒有創建SQLiteQueryBuilder的實例並使用它,而是使用sqldb.query(...),如上所示。我不確定它們之間有什麼不同,但它終於成功了。如果有人想分享,請做。

public Cursor getRosterCursor (Context context) { 

    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 
    queryBuilder.setTables(NURSE_TABLE); 

    Cursor cursor = queryBuilder.query(sqldb, new String[] { 
      KEY_NURSE_ROWID, 
      KEY_LNAME, 
      KEY_FNAME, 
      KEY_MI}, 
      null, null, null, null, null); 

    return cursor; 
} 

爲別人那裏一對夫婦的其他新手的經驗教訓: 1.請使用光標的「_id」字段。沒有這個指針就不能運行。
2.對於簡單列表視圖,while或for循環不是必需的。遊標適配器處理它。 3.無需在遊標上調用moveToFirst()方法。

希望對某人有幫助。

相關問題