2016-12-10 65 views
1

我有存儲在它的錢的項目表,按日期。
一些資金項目類型爲貸款和他人借用。與工會選擇所有聲明拋出異常:沒有這樣的列:借

我想要做的,放在一個ListView 3個元素:日期,貸款金額爲這個日期的總和,借款金額爲這個日期的總和。

這裏是我的代碼,以填補我的光標:

Cursor cursor = mDb.rawQuery("SELECT date_o, loan, borrow FROM " + 
         "(SELECT strftime('%m', date) as date_o, SUM(amount) as loan FROM " + 
         "(SELECT date, amount FROM " + DATABASE_TABLE + " WHERE date > date('now', '-6 months') AND TYPE = " + ActivityClass.DATABASE_LOAN_TYPE + " ORDER BY date DESC) " + 
         "GROUP BY strftime('%m', date) " + 
         "UNION ALL " + 
         "SELECT strftime('%m', date) as date_o, SUM(amount) as borrow FROM " + 
         "(SELECT date, amount FROM " + DATABASE_TABLE + " WHERE date > date('now', '-6 months') AND TYPE = " + ActivityClass.DATABASE_BORROW_TYPE + " ORDER BY date DESC) " + 
         "GROUP BY strftime('%m', date)) GROUP BY date_o", null); 

這裏是代碼,以填補我的ListView:

List<List<Float>> amountByMonth = new ArrayList<>(); 
     List<Float> data = new ArrayList<>(); 

     if (cursor.moveToFirst()) { 
      do { 
       data.add(Float.parseFloat(cursor.getString(0))); 
       data.add(Float.parseFloat(cursor.getString(1))); 
       data.add(Float.parseFloat(cursor.getString(2))); 
       amountByMonth.add(data); 
      } 
      while (cursor.moveToNext()); 
     } 

所以我的函數會返回一個List<List<Float>>

我的問題是:

Couldn't read row 0, col 2 from CursorWindow 

所以我的調查表明,cursor.getString(2)不存在(拋出異常),我認爲我的查詢被嚴重構成。

表詳細信息如下:

private static final String TABLE_MONEY = "money", 
      KEY_MONEY_ID = "id", 
      KEY_MONEY_TITLE = "title", 
      KEY_MONEY_AMOUNT = "amount", 
      KEY_MONEY_DETAILS = "details", 
      KEY_MONEY_DATE = "date", 
      KEY_MONEY_TYPE_FK_ID = "type", 
      KEY_MONEY_CONTACT_FK_ID = "contact", 
      KEY_MONEY_REMINDER_FK_ID = "reminder"; 

如果您需要進一步的細節,不要猶豫,問。

編輯:我修改我的查詢,是因爲我在測試//。 我在這裏得到的問題是列借用是未知的。

+0

感謝Rotwang,但是你就不能幫幫我嗎?我想也許這是我需要的一種加入,你不覺得嗎?有什麼方法可以幫助你,而不是在評論中感到不安?會真的幫助我(並感謝減1)。 – Alexandre

+1

嗨Rotwang,我的帖子,真的認爲你很傷心。對於你的解決方案,它工作的很好(線索:列數和列數相同),我的錯誤:認爲貸款和借款會自動完成自己作爲我的請求的第二和第三列。 – Alexandre

+1

沒關係。一個建議:研究將要用來避免這種錯誤的SQL語句的邏輯。 –

回答

1

目前,你假裝閱讀列僅選擇時:SELECT strftime('%m', date) as date_o, SUM(amount) as loan ...

當您使用UNION條款,你必須有相同的列在所有的子查詢(loanborrow AREN在同一列中)。
您可以使用在各自的子查詢0 AS borrow0 AS loan假冒列佔位符的第三列。

即:

Cursor cursor = mDb.rawQuery("SELECT date_o, loan, borrow FROM " + 
    "(SELECT strftime('%m', date) as date_o, SUM(amount) as loan, 0 AS borrow FROM " + 
    "(SELECT date, amount FROM " + DATABASE_TABLE + " WHERE date > date('now', '-6 months') AND TYPE = " + ActivityClass.DATABASE_LOAN_TYPE + " ORDER BY date DESC) " + 
    "GROUP BY strftime('%m', date) " + 
    "UNION ALL " + 
    "SELECT strftime('%m', date) as date_o, 0 AS loan, SUM(amount) as borrow FROM " + 
    "(SELECT date, amount FROM " + DATABASE_TABLE + " WHERE date > date('now', '-6 months') AND TYPE = " + ActivityClass.DATABASE_BORROW_TYPE + " ORDER BY date DESC) " + 
    "GROUP BY strftime('%m', date)) GROUP BY date_o", null); 
+0

仍然smthg失蹤,這解決了我拋出的錯誤,但似乎第二個選擇刪除第一個貸款數據。我的意思是我希望得到例如帶有日期的光標(0),帶有值1的光標(1)和帶有值2的光標(2)。我目前所有的遊標(1)都是0.仍然卡住了sry。 – Alexandre

+1

顯示的結果是錯誤。也許我應該創建另一個帖子。這是一個正在處理的例外情況,現在已經解決了。 – Alexandre

+0

快速提示:您可以使用SQLite Manager(一個FireFox插件)快速檢查數據庫副本上的SQL查詢和命令。我覺得它非常有用。 –

相關問題