带有多表SQLite数据库的空白ListView
我试图用关系数据库中的数据填充ListView。我试图做到的是显示护士表中的每位护士,以及分配给该护士的房间号。我得到的结果是显示两个按钮的布局和一个空的ListView 创建数据库的代码是:带有多表SQLite数据库的空白ListView,sqlite,listview,android-layout,Sqlite,Listview,Android Layout,我试图用关系数据库中的数据填充ListView。我试图做到的是显示护士表中的每位护士,以及分配给该护士的房间号。我得到的结果是显示两个按钮的布局和一个空的ListView 创建数据库的代码是: public void onCreate(SQLiteDatabase db) { // create NURSE_TABLE db.execSQL("CREATE TABLE " + NURSE_TABLE + " (" + KEY_NURSE_ROWID + " INTEGER PRI
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()
生成光标的代码如下所示:
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>
最后,我的布局如下所示:
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>
最初开始时,我只是用护士表中的数据填充ListView,这很有效,但自从我开始尝试让这两个表一起工作以来,我经历了一段很长的时间
非常感谢您的任何帮助/指导。您的
setTables()
调用中的两个表没有正确连接
从\u nurseTable到\u 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)命令行工具。)您到底有什么问题?布局在顶部有两个按钮,但listview完全为空。我看不到日志上有任何错误。请将此信息放到问题中。我试图显示的内容如下:值班Johnson Robin R(下一行)任务:Rm 1 Rm 2但我正在努力解决如何显示这一点,因为每个护士之间的房间数可能会发生变化。感谢您的回复,我正在研究如何正确地加入表。您的returnedColumns[]
有一个“\u id”字段,因此我假设这是KEY\u NURSE\u ROWID
的值。如果没有左会合,没有房间的护士就不会出现(这可能不是你想要的)。如果不使用聚合函数.nurseQueryBuilder.setTables(“Nurse_Table JOIN Room_Table ON Room_Table.Nurse_id=Nurse_Table._id”);这个代码似乎在工作,我遇到的问题是,如果没有为护士分配房间号(护士id字段为空)。我试图做的是1)显示所有进入护士表的护士,2)房间表中护士id字段与护士表匹配的任何行。我敢肯定的是,由于启动时桌上没有房间,所以一切都是空白的。