我正在尝试创建一个消耗性列表视图,其中标题文本从“ Organ features”列中引出,子文本从pharynx列中引出,这是我的数据库结构:
仅当器官特征的子列表(=咽部的实例)不为空时,我才希望器官特征显示为标头。 这就是我到目前为止的结果(如您所见,咽部的静脉引流是空的,但仍显示为标题,我不希望这样):
我认为我应该添加一条语句“ if(DATABASECHILD_1!= null)”或类似的内容..
感谢您的帮助!
Database.Java
package ma.ac.iav.learn;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;
public class Database {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "URTdd.db";
private static final String DATABASE_TABLE = "OrganAnatomy";
public static final String DATABASE_ID = "_id";
public static final String DATABASE_GROUP_1 = "Organ_features";
public static final String DATABASE_CHILD_1 = "Pharynx";
private final Context mContext;
private DatabaseHelper mDatabaseHelper;
private SQLiteDatabase mDB;
public Database(Context context) {
mContext = context;
}
public void open() {
mDatabaseHelper = new DatabaseHelper(mContext, DATABASE_NAME, null, DATABASE_VERSION);
mDB = mDatabaseHelper.getWritableDatabase();
}
public void close() {
if (mDatabaseHelper != null) mDatabaseHelper.close();
}
public Cursor getDatabase() {
return mDB.query(DATABASE_TABLE, null, null, null, null, null, DATABASE_GROUP_1);
}
public Cursor getID(long rowID) {
return mDB.query(DATABASE_TABLE, null, "_id" + " = "
+ rowID, null, null, null, null);
}
public class DatabaseHelper extends SQLiteAssetHelper {
public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
}
}
MainActivity.java
package ma.ac.iav.learn;
import android.content.Context;
import android.database.Cursor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ExpandableListView;
import android.widget.SimpleCursorTreeAdapter;
public class MainActivity extends AppCompatActivity {
ExpandableListView expandableListView;
Database mDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
"Called when the database has been opened."
https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onOpen(android.database.sqlite.SQLiteDatabase)
*/
mDatabase = new Database(this);
mDatabase.open();
/*
"This interface provides random read-write access to the result set returned by a database query."
https://developer.android.com/reference/android/database/Cursor.html
*/
Cursor cursor = mDatabase.getDatabase();
startManagingCursor(cursor);
/*
"A list of column names that will be used to display the data for a group."
"The group views (from the group layouts) that should display column in the "from" parameter."
"A list of column names that will be used to display the data for a child."
"The resource identifier of a layout file that defines the views for a child."
https://developer.android.com/reference/android/widget/SimpleCursorTreeAdapter.html#SimpleCursorTreeAdapter(android.content.Context, android.database.Cursor, int, java.lang.String[], int[], int, java.lang.String[], int[])
*/
String[] groupFrom = {
Database.DATABASE_GROUP_1,
};
int[] groupTo = {
R.id.group1,
};
String[] childFrom = new String[]{
Database.DATABASE_CHILD_1,
};
int[] childTo = {
R.id.child1,
};
/*
"An easy adapter to map columns from a cursor to TextViews or ImageViews defined in an XML file."
https://developer.android.com/reference/android/widget/SimpleCursorTreeAdapter.html
*/
SimpleCursorTreeAdapter simplecursortreeAdapter = new ExpandableListViewAdapter(
this,
cursor,
R.layout.list_group,
groupFrom,
groupTo,
R.layout.list_child,
childFrom,
childTo
);
/*
"Finds a view that was identified by the android:id XML attribute that was processed in onCreate(Bundle)."
"Sets the adapter that provides data to this view."
https://developer.android.com/reference/android/app/Activity.html#findViewById(int)
https://developer.android.com/reference/android/widget/ExpandableListView.html#setAdapter(android.widget.ExpandableListAdapter)
*/
expandableListView = findViewById(R.id.expandableListview);
expandableListView.setAdapter(simplecursortreeAdapter);
}
/*
"Closes the Cursor, releasing all of its resources and making it completely invalid."
https://developer.android.com/reference/android/database/Cursor.html#close()
*/
protected void onDestroy() {
super.onDestroy();
mDatabase.close();
}
private class ExpandableListViewAdapter extends SimpleCursorTreeAdapter {
private ExpandableListViewAdapter(
Context context,
Cursor cursor,
int groupLayout,
String[] groupFrom,
int[] groupTo,
int childLayout,
String[] childFrom,
int[] childTo) {
super(context, cursor, groupLayout, groupFrom, groupTo, childLayout, childFrom, childTo);
}
/*
"Gets the Cursor for the children at the given group."
https://developer.android.com/reference/android/widget/CursorTreeAdapter.html#getChildrenCursor(android.database.Cursor)
*/
protected Cursor getChildrenCursor(Cursor groupCursor) {
return mDatabase.getID(groupCursor.getInt(groupCursor.getColumnIndex(Database.DATABASE_ID)));
}
}
}
答案 0 :(得分:0)
我相信您希望基于:-
进行查询SELECT * FROM OrganAnatomy WHERE Pharynx IS NOT NULL ORDER BY Organ_features;
这将导致:-
要将其转换为供SQLiteDatabase
query
方法使用,则代码不是:-
public Cursor getDatabase() {
return mDB.query(DATABASE_TABLE, null, null, null, null, null, DATABASE_GROUP_1);
}
可能是:-
public Cursor getDatabase() {
String whereclause = DATABASE_CHILD_1 + " IS NOT NULL";
return mDB.query(DATABASE_TABLE, null, whereclause, null, null, null, DATABASE_GROUP_1);
}
SELECT * FROM OrganAnatomy GROUP BY _id HAVING Pharynx IS NOT NULL ORDER BY Organ_features;
(因为_id的名称将是唯一的,因此每一行都将在其自己的组中)。