2012-08-31 3 views
0

SQLite 데이터베이스의 데이터로 ListView를 채우려는 내 머리를 때리고 있습니다. 무수한 튜토리얼과 똑같이 무수한 게시물을 읽었지만 분명히 중요한 것을 얻지는 않습니다. 다음 두 코드가 왜 함께 작동하지 않는지, 아니면 완전히 다른 무언가를보아야하는지에 대한 힌트를 누군가가 얻을 수 있기를 바랬습니다. 어떤 도움을 주시면 감사하겠습니다. 내가 얻는 결과는 힘이 가깝다는 것이다. ListView에 객체를 SimpleCursorAdapter 반환SQLite 데이터베이스의 데이터로 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); 
} 

방법 채우기 시작

방법 :

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() 메서드를 호출 할 필요가 없습니다.

누군가에게 도움이되기를 바랍니다.

관련 문제