【问题标题】:Sort DB data and display in list view对数据库数据进行排序并在列表视图中显示
【发布时间】:2012-04-13 10:26:50
【问题描述】:

我使用

从我的数据库中获取数据
cursor = db.query("WebLeadMaster", select, "condition1="+conditionVal1+
" and condition2="+ConditionVal2,null, null, null, "RegistrationTime DESC");

我的光标中的数据正常。为了显示数据,我使用以下代码:

    SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, 
            R.layout.resultleadlookup, cursor, columns, to); 
    mAdapter.notifyDataSetChanged();
    lstResult.setAdapter(mAdapter);

所以,我无法修改光标的内容。排序查询的条件“RegistrationTime”是一个字符串数据类型。如下图所示,它的排序格式不正确。 (不是根据日期时间)。

我应该对我的代码进行哪些更改,以便它可以根据日期时间正确排序?

如果我改变我的数据库查询,看起来像

cursor = db.query("WebLeadMaster", select, "condition1="+conditionVal1+
" and condition2="+ConditionVal2,null, null, null, null);

它给出一个升序。我只想要它的降序。

【问题讨论】:

  • 只要反转它就会变成降序
  • 您的时间按降序顺序给出,这意味着最高值位于顶部。您想要默认的 升序 顺序,请参阅我的答案以获取代码示例。
  • @Sam hehe 我没有注意到我第一次阅读这个问题,但是,你是对的,RegistrationTime 是按降序排序的......他正在尝试对数据进行排序在描述中。按 id 排序??(行中的第二个字段)

标签: android sqlite cursor


【解决方案1】:

最简单的建议是以不同的格式(但仍保存为字符串)将日期保存到数据库中。如果您将数据保存为 SQLite 的默认日期格式(YYYY-MM-DD HH:NN:SS),您可以轻松地对日期进行排序。

要以您的格式显示日期,您只需将日期重新格式化为正确的格式。

【讨论】:

  • android 给出了该格式的错误。所以我把它改成了(yyyy-MM-dd hh:mm:ss)。但我仍然遇到同样的问题......另外,RegistrationDate 是数据类型“字符串”所以,不知道格式的变化是否会产生任何影响。
  • dennisg 意味着您应该将 db 中的数据更改为这种格式(仍然是字符串/varchar,但存储在“yyyy-MM-dd hh:mm:ss”/因为 SQLIte 没有日期时间格式).. . 然后你可以将此列排序为字符串,就可以了...
  • 我确实使用了 Selvin... 但如果我有时间价值:(2012-04-15 10:30:20 AM), (2012-04-15 11:10:20 PM) , (2012-04-15 12:30:20 PM) 和 (2012-04-15 2:30:20 PM), 它显示 DESC 顺序为: (2012-04-15 12:30:20 PM) , (2012-04-15 11:10:20 PM),(2012-04-15 10:30:20 AM), (2012-04-15 2:30:20 PM) 这是不正确的!
  • @Pallavi 将时间值更改为:(2012-04-15 10:30:20), (2012-04-15 23:10:20), (2012-04-15 12: 30:20) 和 (2012-04-15 14:30:20) 即删除 PM 和 AM,使用 24 小时格式。
【解决方案2】:

嗯,我改变了我的表结构。我在其中添加了另一个字段“_id”。将属性设置为 AUTO INCREMENT,并根据 _id 字段对列表进行排序。

【讨论】:

    【解决方案3】:

    如果您使用 ORM,您可以按时间戳对数据进行排序。 ORM 使从数据库中的数据插入和数据检索更容易。 您必须在项目中包含 jar 文件才能使用 ORM...

    【讨论】:

    • 日期-时间是数据类型“字符串”先生。
    【解决方案4】:

    由于 SQLite 没有 datetime 类型,在 SQLite(EPOCH 时间)中存储日期类型为 LONG/INT/NUMERIC 会更容易排序

    然后将ViewBinder 添加到Adapter

            /*field in activity/fragment*/
            final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //or other format that you wana to show in ListView
            ...
            mAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
    
                @Override
                public boolean setViewValue(View view, Cursor cursor,
                        int columnIndex) {
                    final int id = view.getId();
                    switch (id) {
                        case R.id.id_of_textview_with_date_data:
                            final Calendar cal = Calendar.getInstance();
                            cal.setTimeInMillis(cursor.getLong(columnIndex));
                            ((TextView) view).setText(sdf.format(cal.getTime()));
                            return true;
                    }
                    return false;
                }
            });
    

    ... 或如 dennisg 指出的那样将其存储为 STRING/VARCHAR edit:以“yyyy-MM-dd HH:mm:ss”格式

    【讨论】:

    • SQLite 具有 DATETIME、DATE 和 TIMESTAMP 数据类型。 SQLite 使用内置的 built-in date and time functions 将它们转换为 INTEGER、REAL 或 TEXT。
    • @Sam 大声笑,大声笑和大声笑再次从文档中...SQLite does not have a storage class set aside for storing dates and/or times. ...无论如何,请向我展示使用db.update(cv) 使用混合长或字符串值更新/插入日期类型的工作代码...
    • 你说得对,它不是基础存储类,但是这个语句不是错误CREATE TABLE foo (time TIMESTAMP);,因为存在数据类型TIMESTAMP。
    • 但是您仍然可以将字符串放在一行中,并将 int 放在第二行(到同一列)...所以您必须从您的应用程序中控制它
    • 是的,如果 SQLite 拥有严格的类型定义而不是 type affinity,那就太好了。虽然我让应用程序没有时间保持并让 SQLite 维护它。示例:CREATE TABLE foo (created TIMESTAMP DEFAULT CURRENT_TIMESTAMP, modified TIMESTAMP NOT NULL);INSERT INTO foo (modified) VALUES (CURRENT_TIME); 这样我就不能搞砸自己的数据了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多