2016-11-21 87 views
0

(用什麼我迄今制定出更新的注意問題) 我寫的是具有由下記錄位置的應用程序:SELECT DISTINCT不工作的Android SQLite的

id(primary), state, region, area, latitude, longitude 

我能得到的所有數據屏幕,但我只想列出的狀態,只有國家沒有任何其他數據。每個唯一條目也只有一個條目。即新南威爾士州1個,而不是全部99個。然後用戶將選擇他們所居住的所需狀態,然後它將顯示一個新的數據表格,僅用於該狀態。 (我指的是NSW,VIC,QLD等)

類'Dataprovider和recyclerview類也可以正常工作,所以除非有人想看到它,否則我會保留這些代碼。

這裏是有問題的數據庫類。

public class MyDatabase extends SQLiteAssetHelper { 

private static final String DATABASE_NAME = "ReefData.db"; 
private static final int DATABASE_VERSION = 1; 

public MyDatabase(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    setForcedUpgrade(); 

} 

public Cursor getData(){ 
    SQLiteDatabase db = getReadableDatabase(); 
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 
    String [] sqlSelect = {"0 _id", "state", "area", "region", "latitude", "longitude"}; 
    String sqlTables = "Reefs"; 
    qb.setTables(sqlTables); 
    Cursor c = qb.query(db, sqlSelect, null, null, null, null, null); 
    c.moveToFirst(); 
    return c; 
}} 

所以我第一次嘗試如下:

String [] sqlSelect = {"0 _id", "state=DISTINCT", "area", "region", "latitude", "longitude"}; 

但只是給我一個錯誤。

,所以我改變它回到了一部開拓創新,並修改查詢,如下所示:

String [] sqlSelect = {"0 _id", "state", "area", "region", "latitude", "longitude"}; 
Cursor c = qb.query(db, sqlSelect, "state= 'TAS'", null, null, null, null); 

而這個工作現在只爲TAS數據。我甚至可以修改它

Cursor c = qb.query(db, sqlSelect, "state= 'TAS' and region='Flinders Island'", null, null, null, null); 

它的工程很棒。

但是,我怎樣才能得到一個只有狀態的列表,並且每個只有一個。我會想做以下但它不起作用:

Cursor c = qb.query(db, sqlSelect, "state = DISTINCT", null, null, null, null); 

任何想法?

更新:所以我已經在附加的圖像中嘗試以下,所以我越來越接近解決方案,但不是那裏。仍然需要幫助來解決這個問題。

enter image description here

+0

什麼錯誤它給你? – JMRboosties

+0

就當我運行它,我得到:「不幸的是,APPNAME已停止OK」 – timv

+0

哈你的聲音新的,那好吧,我會解釋。我假設你正在使用Android Studio。當手機連接到編譯代碼的計算機時,可以單擊Android Studio程序底部的Android監視器選項卡。尋找來自您的應用的錯誤日誌(最有可能的紅色文本)。這會給你一些關於什麼崩潰和哪裏(指向導致崩潰的確切代碼行)的細節。與我們分享這裏,我們可以幫助你弄清楚。 – JMRboosties

回答

0

已解決!

所以SQLiteQueryBuilder方法返回一個光標不允許布爾參數直接。

但是在閱讀課堂筆記後,我注意到了方法setDistinct並將其應用於SQLiteQueryBuilder。

現在,它的工作原理,並讓我對每個國家只有一個唯一的入口,正是我一直在努力做的事。我確實需要刪除其他列,只關注狀態,但那是另一個問題/解決方案不涉及這個問題。我只想說,我不得不把重點放在剛剛列狀態和應用setDistinct該列只得到期望的結果。

繼承人的完成代碼:

public Cursor getData(){ 
    SQLiteDatabase db = getReadableDatabase(); 
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 
    String [] sqlSelect = {"0 _id", "state"}; 
    String sqlTables = "Reefs"; 
    qb.setTables(sqlTables); 
    qb.setDistinct(true); 
    Cursor c = qb.query(db, sqlSelect, null, null, null, null, null); 
    c.moveToFirst(); 
    return c; 
} 
0

你在這一行一個錯誤0

String [] sqlSelect = {"0 _id", "state", "area", "region", "latitude", "longitude"};` 
         ^here 

我懷疑你不打算選擇一個文字值,所以你應該將其刪除:

String [] sqlSelect = {"_id", "state", "area", "region", "latitude", "longitude"};` 

如果你確實打算選擇文字值,那麼你需要用逗號分隔它:

String [] sqlSelect = {"0", "_id", "state", "area", "region", "latitude", "longitude"};` 
          ^here 
+0

Hi Karakuri。有趣的是「0 _id」起作用,「_id」和「0」,「_id」這兩個選項都會導致SQLite錯誤。我會更新這個問題,以更好地反映我的問題以及迄今爲止所做的工作。謝謝你的幫助。 – timv

+0

@timv我不明白這是怎麼可能的,字面上應該會產生一個語法錯誤,就像堆棧跟蹤中曾經是你問題一部分的錯誤一樣。 – Karakuri

+0

仍處於源碼一個新手,所以原諒我的無知。我知道你的權利,但我不認爲你有我的修改問題的想法? – timv