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 つのテーブルを連携させようとして以来、非常に苦労しました。
どんな助け/指示も大歓迎です。