2012-04-13 79 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