0

ListView にリレーショナル データベースのデータを入力しようとしています。私が達成しようとしているのは、NURSE_TABLE の各看護師と、その看護師に割り当てられた部屋番号を表示することです。結果として得られるのは、2 つのボタンと空の ListView を示すレイアウトです。

データベースを作成するコードは次のとおりです。

public void onCreate(SQLiteDatabase db) {
// create NURSE_TABLE
db.execSQL("CREATE TABLE " + NURSE_TABLE + " (" + KEY_NURSE_ROWID
        + " INTEGER PRIMARY KEY AUTOINCREMENT, " +          KEY_LNAME
        + " TEXT NOT NULL, " + KEY_FNAME + " TEXT NOT NULL, "
        + KEY_MI + " TEXT, " + KEY_EMAIL + " TEXT NOT NULL, "
        + KEY_PHONE_PRIMARY + " TEXT NOT NULL, "
        + KEY_PHONE_SECONDARY + " TEXT, " + KEY_FTE
        + " TEXT NOT NULL, " + KEY_DUTY_STATUS + " TEXT NOT NULL);");

// create ROOM_TABLE
db.execSQL("CREATE TABLE " + ROOM_TABLE + " (" + KEY_ROOM_ROWID
        + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_TYPE_PATIENT
        + " TEXT, " + KEY_OCCUPIED + " TEXT NOT NULL, "
        + KEY_ROOM_NUMBER + " TEXT NOT NULL, "
        + KEY_ASSIGNED_NURSE + " INTEGER, " 
        + " FOREIGN KEY (" + KEY_ASSIGNED_NURSE + ") REFERENCES " 
        + NURSE_TABLE + " (" + KEY_NURSE_ROWID + "));");
    } // onCreate

アクティビティのコードは次のとおりです。

public void displayNurseRoster(){

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

    // int variables filled with NURSE_TABLE data
    int[] to_nurseTable = new int[] {

            // int list for data from NURSE_TABLE fields
            R.id.rosterDutyStatus,
            R.id.rosterListLname, 
            R.id.rosterListFname, 
            R.id.rosterListMI, 
            R.id.rosterListID,

            // int list for data from ROOM_ROWID fields
            R.id.firstAssignment,
            R.id.secondAssignment,
            R.id.thirdAssignment,
            R.id.fourthAssignment,
            R.id.fifthAssignment,
            R.id.sixthAssignment };

    // String array holding data fields from NURSE_TABLE 
    String[] from_nurseTable = new String [] {

            // fields from NURSE_TABLE
            DbCommunicator.KEY_DUTY_STATUS,
            DbCommunicator.KEY_LNAME, 
            DbCommunicator.KEY_FNAME, 
            DbCommunicator.KEY_MI,
            DbCommunicator.KEY_NURSE_ROWID,
            DbCommunicator.KEY_ROOM_NUMBER}; 

    // instantiate instance of DbCommunicator object
    rosterView = new DbCommunicator(this);

    // open instance
    rosterView.open();

    // get & manage cursor for NURSE_TABLE data
    Cursor nurseTableCursor = rosterView.getNurseRosterCursor(this);
    startManagingCursor(nurseTableCursor);

    // instantiate cursor adaptor
    ListAdapter nurseTableAdapter = new SimpleCursorAdapter(this,
    R.layout.nurse_list, nurseTableCursor, from_nurseTable, to_nurseTable);

    nurseTableCursor.moveToNext();

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

Cursor を生成するコードは次のようになります。

public Cursor getNurseRosterCursor (Context context) {

    SQLiteQueryBuilder nurseQueryBuilder = new SQLiteQueryBuilder();
    nurseQueryBuilder.setTables("NURSE_TABLE, ROOM_TABLE"); 

    String[] returnedColumns = new String[] {
            "Nurse_Table._id", 
            "Nurse_Table._dutyStatus",
            "Nurse_Table._lName",
            "Nurse_Table._FName",
            "Nurse_Table._mi",
            "Room_Table._id",
            "Room_Table._roomNumber"};

    Cursor nurseCursor = nurseQueryBuilder.query(sqldb, returnedColumns,
            null, null, null, null, null);

    return nurseCursor;
}

最後に、私のレイアウトは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#81BEF7"
android:orientation="vertical" >

<Button
    android:id="@+id/btnAddNurseToRoster"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/add" 
    android:focusable="true"/>

<Button
    android:id="@+id/btnRemoveNurseFromRoster"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/btnAddNurseToRoster"
    android:layout_toRightOf="@+id/btnAddNurseToRoster"
    android:text="@string/delete" 
    android:focusable="true"/>

<ListView
    android:id="@+id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_below="@+id/btnAddNurseToRoster"
    android:textColor="#FFFFFF"
    android:textStyle="bold"/>

</RelativeLayout>

私が最初に始めたときは、Nurses Table のデータを ListView に取り込んでいただけでした。これはうまく機能しましたが、2 つのテーブルを連携させようとして以来、非常に苦労しました。

どんな助け/指示も大歓迎です。

4

1 に答える 1

0

呼び出しの 2 つのテーブルsetTables()が正しく結合されていません。

と配列が一致しませんfrom_nurseTableto_nurseTable

リストビューに何を表示したいかについては言及していませんが、次のクエリの結果のようなものになると思います。

SELECT nurse_table._id,_dutyStatus,_lName,_FName,_mi,group_concat(_roomNumber)
  FROM nurse_table LEFT JOIN room_table ON nurse_table._id = _assignedNurse
  GROUP BY nurse_table._id
  ORDER BY _lName,_FName /* or whatever */

SQL クエリの作成方法がわからない場合は、デスクトップ上のデータベースのコピーでクエリをテストする方が役立つことがよくあります。(多くの SQLite 管理ツールがあります。または、最後の復元として、sqlite(.exe) コマンドライン ツールを使用します。)

于 2012-09-09T14:41:52.153 に答える