使用SQLite数据库中的数据填充ListView

时间:2012-08-31 04:32:33

标签: sqlite listview simplecursoradapter

我一直在试图用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;
}

1 个答案:

答案 0 :(得分: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.始终使用&#34; _id&#34;光标中的字段。没有它,光标无法正常工作 2.简单列表视图不需要while或for循环。游标适配器处理它。 3.无需在游标上调用moveToFirst()方法。

希望对某人有所帮助。