2012-04-13 46 views
4

我使用排序DB数据和显示

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

我得到我的光标数据好吗从我的DB数据。要显示数据,我使用以下代码:

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

因此,我无法修改游标的内容。排序查询的条件是“RegistrationTime”,它是一个字符串数据类型。正如你在下面的图片中看到的,它的格式不正确。 (不是根据日期时间)。

我应该在我的代码中做些什么改变,以便根据日期时间正确排序?

expected output and actual output

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

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

它提供了一个升序排列。所有我想要它的降序。

+0

只是相反它会变得下降 – Sameer 2012-04-13 10:50:36

+1

您的时间在_descending_ order,这意味着最高值在顶部。你想要默认的_ascending_ order,查看我的答案代码示例。 – Sam 2012-04-13 15:05:27

+0

@Sam hehe我没有注意到,我第一次读到这个问题,但是,你是对的,RegistrationTime按降序排列......并且他试图按照desc对数据进行排序。按ID顺序排列(第二个字段在行中) – Selvin 2012-04-13 16:05:57

回答

2

嗯,我改变了我的表格结构。我添加了另一个字段“_id”。将该物业设置为AUTO INCREMENT,并对_id字段进行排序。

1

如果使用ORM,则可以按时间戳排序数据。 ORM使数据插入和数据检索更容易。 您必须将jar文件包含到您的项目才能使用ORM ...

+0

date-Time是数据类型“String”的先生。 – Pallavi 2012-04-13 10:52:46

2

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

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

+0

android为该格式提供了错误。所以我将它改为(yyyy-MM-dd hh:mm:ss)。但我仍然遇到同样的问题... 此外,RegistrationDate是数据类型“字符串”,所以不知道格式的变化是否会有所作为。 – Pallavi 2012-04-13 11:03:53

+0

dennisg意味着你应该将db中的数据更改为这种格式(stil字符串/ varchar,但存储在“yyyy-MM-dd hh:mm:ss”中/因为SQLIte没有日期时间格式)...那么你可以对此列进行排序作为字符串,将罚款... – Selvin 2012-04-13 11:30:16

+0

我确实使用了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 03:53:54

0

因为SQLite的在SQLite的日期时间没有类型,存储日期类型,只要/ INT /数字(大纪元)会比较容易进行排序

再加入ViewBinderAdapter

 /*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 编辑:在“yyyy-MM-dd HH:mm:ss”格式

+0

SQLite具有DATETIME,DATE和TIMESTAMP数据类型。 SQLite使用内置的[内置日期和时间函数](http://www.sqlite.org/lang_datefunc.html)将它们转换为INTEGER,REAL或TEXT。 – Sam 2012-04-13 14:58:47

+0

@Sam lol,lol和lol再次来自文档...'SQLite没有专门用于存储日期和/或时间的存储类。“...无论如何,显示使用'db更新/插入datetype的工作代码。更新(cv)'与混合长或字符串值... – Selvin 2012-04-13 15:07:13

+0

你是对的,它不是一个基_storage class_,但这个语句不是一个错误'CREATE TABLE foo(time TIMESTAMP);'因为数据类型TIMESTAMP存在。 – Sam 2012-04-13 15:10:42