w_xue 2013-10-18 10:33 采纳率: 0%
浏览 1932

将两张表的数据展示在一个ListView中

数据库中的数据如图所示,一共有5张表,三个数据表以及两个关系表。我现在需要将所有的project和exam读取出来然后将其中的name和description显示在同一个ListView中,根据数据表中的session sort no来排序。
现在的问题:
1.如何同时读取所有的exam和project数据并根据session sort no来排序呢?因为数据比较多,所以应该不会一次性完成读取,而是用类似SimpleCursorAdapter。
2.根据现有的数据库设计,有没有什么比较好的办法可以在adapter中很方便的判断是否从cursor中读取到的数据是exam还是project?

数据库设计如下:
CSDN移动问答

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-09-06 16:55
    关注

    该回答引用ChatGPT-3.5,仅为您供参考,不保证完全正确
    要将两张表的数据展示在一个ListView中,你可以使用一个CursorLoader来异步加载数据并将其排序,然后使用一个自定义的Adapter来将数据显示在ListView中。以下是解决问题的一般步骤:

    1. 创建一个CursorLoader来加载exam和project数据,并将它们按照session sort no排序。你可以使用合适的SQL查询语句来实现这一点。

    2. 创建一个自定义的Adapter,继承自CursorAdapter或RecyclerView.Adapter,用于将数据显示在ListView中。

    3. 在Adapter的getView方法中,你可以根据从Cursor中读取的数据来判断它是exam还是project,并相应地显示在ListView中。

    下面是一些示例代码来帮助你开始:

    public class MyLoaderActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {
        private ListView listView;
        private MyCursorAdapter adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            listView = findViewById(R.id.listView);
            adapter = new MyCursorAdapter(this, null);
            listView.setAdapter(adapter);
    
            getLoaderManager().initLoader(0, null, this);
        }
    
        @Override
        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
            String[] projection = {
                BaseColumns._ID,
                "name",
                "description",
                "session",
                "sort_no"
            };
    
            String selection = null;
            String[] selectionArgs = null;
            String sortOrder = "session ASC, sort_no ASC";
    
            return new CursorLoader(this, CONTENT_URI, projection, selection, selectionArgs, sortOrder);
        }
    
        @Override
        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
            adapter.swapCursor(data);
        }
    
        @Override
        public void onLoaderReset(Loader<Cursor> loader) {
            adapter.swapCursor(null);
        }
    }
    

    在上述代码中,MyCursorAdapter是你自定义的Adapter类,你需要根据Cursor中的数据来判断是exam还是project,并显示在ListView中。你可以在Adapter的getView方法中实现这一逻辑。


    这是一个基本的示例,你可以根据你的具体需求进一步扩展和定制。希望这能帮助你开始解决你的问题。如果需要更多帮助,请提供更多具体的代码和数据库结构信息。


    该回答引用NewBing,仅为您供参考,不保证完全正确
    根据你的描述,你想要从你的数据库中读取所有的exam和project数据,并根据session sort no来排序,然后在一个ListView中显示它们的name和description。这是一个比较复杂的任务,但是我可以给你一些可能的方案。


    一种可能的方案是使用一个SQL语句来联合查询你的三个数据表,然后使用一个SimpleCursorAdapter来绑定查询结果到ListView。例如,你可以使用以下SQL语句来查询你想要的数据:

    SELECT e.name, e.description, s.session_sort_no FROM exam e
    JOIN exam_session es ON e.exam_id = es.exam_id
    JOIN session s ON es.session_id = s.session_id
    UNION ALL
    SELECT p.name, p.description, s.session_sort_no FROM project p
    JOIN project_session ps ON p.project_id = ps.project_id
    JOIN session s ON ps.session_id = s.session_id
    ORDER BY session_sort_no;
    

    这个语句会将exam和project的name和description以及对应的session sort no合并在一起,并按照session sort no升序排列。你可以使用rawQuery()方法来执行这个语句,并得到一个Cursor对象。


    然后,你可以使用一个SimpleCursorAdapter来将Cursor对象绑定到ListView。例如,你可以使用以下代码来创建一个SimpleCursorAdapter:

    String[] from = new String[] {"name", "description"};
    int[] to = new int[] {R.id.name, R.id.description};
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list_item, cursor, from, to);
    

    这个代码会将Cursor对象中的name和description列分别映射到list_item布局中的name和description控件上。list_item布局可以是一个简单的LinearLayout,包含两个TextView,分别用于显示name和description。


    最后,你可以使用setListAdapter()方法来将SimpleCursorAdapter设置到ListView上。例如,你可以使用以下代码来设置ListView:

    ListView listView = (ListView) findViewById(R.id.list_view);
    setListAdapter(adapter);
    

    这个代码会将adapter设置到id为list_view的ListView上。


    这样,你就可以在一个ListView中显示你想要的数据了。


    另一种可能的方案是使用两个Cursor对象来分别查询exam和project的数据,然后使用一个MergeCursor来合并它们,再使用一个SimpleCursorAdapter来绑定到ListView。例如,你可以使用以下代码来创建两个Cursor对象:

    Cursor cursor1 = db.rawQuery("SELECT e.name, e.description, s.session_sort_no FROM exam e JOIN exam_session es ON e.exam_id = es.exam_id JOIN session s ON es.session_id = s.session_id ORDER BY session_sort_no", null);
    Cursor cursor2 = db.rawQuery("SELECT p.name, p.description, s.session_sort_no FROM project p JOIN project_session ps ON p.project_id = ps.project_id JOIN session s ON ps.session_id = s.session_id ORDER BY session_sort_no", null);
    

    这两个代码会分别查询exam和project的数据,并按照session sort no升序排列。


    然后,你可以使用一个MergeCursor来合并这两个Cursor对象。例如,你可以使用以下代码来创建一个MergeCursor对象:

    MergeCursor mergeCursor = new MergeCursor(new Cursor[] {cursor1, cursor2});
    

    这个代码会将cursor1和cursor2合并在一起,并保持它们各自的顺序。


    接下来,你可以使用一个SimpleCursorAdapter来将MergeCursor对象绑定到ListView。例如,你可以使用以下代码来创建一个SimpleCursorAdapter:

    String[] from = new String[] {"name", "description"};
    int[] to = new int[] {R.id.name, R.id.description};
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list_item, mergeCursor, from, to);
    

    这个代码与前面的方案中相同,只是将cursor换成了mergeCursor。


    最后,你也可以使用setListAdapter()方法来将SimpleCursorAdapter设置到ListView上。例如,你可以使用以下代码来设置ListView:

    ListView listView = (ListView) findViewById(R.id.list_view);
    setListAdapter(adapter);
    

    这个代码也与前面的方案中相同。


    这样,你也可以在一个ListView中显示你想要的数据了。


    至于你的第二个问题,如何判断从Cursor中读取到的数据是exam还是project,有一些可能的方法。例如,你可以在你的SQL语句中添加一个额外的列,用于标识数据的类型,然后在你的SimpleCursorAdapter中根据这个列的值来做相应的处理。例如,你可以使用以下SQL语句来查询你想要的数据,并添加一个type列:

    SELECT e.name, e.description, s.session_sort_no, 'exam' as type FROM exam e
    JOIN exam_session es ON e.exam_id = es.exam_id
    JOIN session s ON es.session_id = s.session_id
    UNION ALL
    SELECT p.name, p.description, s.session_sort_no, 'project' as type FROM project p
    JOIN project_session ps ON p.project_id = ps.project_id
    JOIN session s ON ps.session_id = s.session_id
    ORDER BY session_sort_no;
    

    这个语句会在每条数据后面添加一个type列,其值为'exam'或'project',用于表示数据的类型。


    然后,你可以使用一个自定义的SimpleCursorAdapter来绑定查询结果到ListView,并重写getView()方法来根据type列的值来做相应的处理。例如,你可以使用以下代码来创建一个自定义的SimpleCursorAdapter:

    class MySimpleCursorAdapter extends SimpleCursorAdapter {
    
        public MySimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
            super(context, layout, c, from, to);
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = super.getView(position, convertView, parent);
            Cursor cursor = getCursor();
            cursor.moveToPosition(position);
            String type = cursor.getString(cursor.getColumnIndex("type"));
            if (type.equals("exam")) {
                // do something for exam data
            } else if (type.equals("project")) {
                // do something for project data
            }
            return view;
        }
    }
    

    这个代码会创建一个自定义的SimpleCursorAdapter,并重写getView()方法来根据type列的值来做相应的处理。你可以根据你的需求来修改这个方法。


    最后,你可以使用setListAdapter()方法来将MySimpleCursorAdapter设置到ListView上。例如,你可以使用以下代码来设置ListView:

    String[] from = new String[] {"name", "description"};
    int[] to = new int[] {R.id.name, R.id.description};
    MySimpleCursorAdapter adapter = new MySimpleCursorAdapter(this, R.layout.list_item, cursor, from, to);
    ListView listView = (ListView) findViewById(R.id.list_view);
    setListAdapter(adapter);
    

    这个代码会将adapter设置到id为list_view的ListView上。


    这样,你就可以根据从Cursor中读取到的数据是exam还是project来做相应的处理了。


    源: 与必应的对话, 2023/9/6
    (1) android - Listview from multiple tables? - Stack Overflow. https://stackoverflow.com/questions/3539684/listview-from-multiple-tables.
    (2) Multicolumn ListView Android - Stack Overflow. https://stackoverflow.com/questions/7848662/multicolumn-listview-android.
    (3) How to combine data from two database tables into one listView. https://stackoverflow.com/questions/13057462/how-to-combine-data-from-two-database-tables-into-one-listview.
    (4) undefined. http://schemas.android.com/apk/res/android.
    (5) android - Join multiple tables to show different content in ListView .... https://stackoverflow.com/questions/42765326/join-multiple-tables-to-show-different-content-in-listview.
    (6) How to join two tables and show them in one listview?. https://www.codeproject.com/questions/689111/how-to-join-two-tables-and-show-them-in-one-listvi.
    (7) android - join two cursor listviews in one with separator lines - Stack .... https://stackoverflow.com/questions/10582608/join-two-cursor-listviews-in-one-with-separator-lines.
    (8) android - Displaying results of a SQL join in a ListActivity - Stack .... https://stackoverflow.com/questions/3483714/displaying-results-of-a-sql-join-in-a-listactivity.
    (9) android - How to show data from cursor into a listview - Stack Overflow. https://stackoverflow.com/questions/17462854/how-to-show-data-from-cursor-into-a-listview.


    该回答引用文心一言,仅为您供参考,不保证完全正确

    1. 读取所有的exam和project数据并根据session sort no来排序的问题:

    你需要创建一个自定义的CursorAdapter来处理这种情况。在这个自定义的CursorAdapter中,你需要重写newView()和bindView()方法。newView()方法用于创建新的视图,bindView()方法用于将数据与视图绑定。


    在newView()方法中,你需要根据当前记录的类型(exam或project)创建不同的视图。例如,如果当前记录是exam,你就创建一个包含exam信息的视图,如果当前记录是project,你就创建一个包含project信息的视图。


    在bindView()方法中,你需要根据当前记录的类型(exam或project)提供不同的数据。例如,如果当前记录是exam,你就提供exam的数据,如果当前记录是project,你就提供project的数据。


    此外,你需要将cursor排序,以便按照session sort no的顺序显示数据。这可以在查询cursor时实现,例如使用"ORDER BY session sort no"语句。

    1. 判断从cursor中读取到的数据是exam还是project的问题:

    在自定义的CursorAdapter中,你可以在newView()和bindView()方法中检查当前记录的类型。例如,你可以使用cursor.getString(cursor.getColumnIndex("table_name"))来获取当前记录的表名,然后根据表名判断是exam还是project。


    注意:你需要将表名存储在数据库中,以便可以从cursor中获取。


    总的来说,你需要创建一个自定义的CursorAdapter来处理这种情况。在这个自定义的CursorAdapter中,你需要重写newView()和bindView()方法,以便根据当前记录的类型创建不同的视图并提供不同的数据。同时,你需要将cursor排序以便按照session sort no的顺序显示数据。


    该回答引用讯飞星火,仅为您供参考,不保证完全正确

    1. 为了同时读取所有的exam和project数据并根据session sort no来排序,你可以使用以下方法:

    首先,你需要创建一个自定义的CursorAdapter,然后重写getView()方法来实现数据的展示。在这个方法中,你可以根据cursor中的数据来判断是exam还是project,并根据session sort no进行排序。


    以下是一个简单的示例:

    public class CustomCursorAdapter extends SimpleCursorAdapter {
        private Context context;
    
        public CustomCursorAdapter(Context context, Cursor cursor) {
            super(context, cursor, 0);
            this.context = context;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // 根据position判断是exam还是project
            if (isExam(position)) {
                // 如果是exam,设置相应的样式
            } else {
                // 如果是project,设置相应的样式
            }
    
            // 获取session sort no
            String sessionSortNo = getItem(position).getString(SessionColumns.SESSION_SORT_NO);
    
            // 根据session sort no进行排序
            if (sessionSortNo != null && sessionSortNo.compareTo("desc") == 0) {
                setViewOrder(position, Constants.DESCENDING);
            } else {
                setViewOrder(position, Constants.ASCENDING);
            }
    
            return super.getView(position, convertView, parent);
        }
    
        private boolean isExam(int position) {
            // 在这里判断是否是exam,例如根据表名或者某个字段来判断
            return SessionColumns.TABLE_NAME.equals("exam");
        }
    }
    
    1. 在adapter中判断是否从cursor中读取到的数据是exam还是project的方法有很多,例如可以根据表名、字段名等来进行判断。在上面的示例中,我们通过判断session sort no的值来决定是升序还是降序排列,从而间接地实现了根据数据类型进行排序。当然,你也可以在getView()方法中直接根据数据内容来判断是exam还是project,然后设置不同的样式。
    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘