2012-08-31 91 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()方法。

希望对某人有帮助。

相关问题