0

我有延伸ExpandableListActivity的活動。當我在Android 2.2+上運行應用程序時,我沒有任何問題。然而,當我在Android 2.1模擬器中運行它,這個活動強制關閉(在應用程序中的其他活動都沒有問題)。我完全難倒了。SimpleCursorAdapter錯誤:列不存在 - 不僅發生在Android 2.1的

我創建了一個自定義適配器與擴展SimpleCursorTreeAdapterExpandableListView使用。我使用下面的代碼設置列表適配器:

customExpandableListAdapter = new BeerFlightsExpandableListAdapter(
            this,           // context 
            beerFlights,         // cursor 
            R.layout.beer_flight_list_item,     // group layout 
            new String[]{"_id", "name"},     // group FROM 
            new int[] {R.id.flight_id, R.id.flight_name}, // group TO 
            R.layout.beer_flight_beer_list_item,   // child layout 
            new String[]{"_id", "name"},     // child FROM 
            new int[]{R.id.beer_id, R.id.beer_name});  // child TO 
setListAdapter(customExpandableListAdapter); 

我使用下面的代碼來獲取光標:

String sql = 
     "SELECT beer_flights._id, beer_flights.name, COUNT(beer_flight_beers.beer_id) AS beer_count"+ 
     " FROM beer_flight_beers"+ 
      " INNER JOIN beer_flights ON beer_flight_beers.beer_flight_id = beer_flights._id"+ 
      " INNER JOIN beer_locations ON beer_flights.location_id = beer_locations.location_id AND beer_locations.beer_id = beer_flight_beers.beer_id"+ 
     " WHERE beer_flights.location_id = ?"+ 
     " GROUP BY beer_flights._id"+ 
     " ORDER BY beer_flights.priority ASC"; 

Cursor cur = db.rawQuery(sql, new String[]{ locationId.toString() }); 

我使用下面的代碼來獲取孩子光標:

String sql = 
     "SELECT DISTINCT beers._id, beers.name, beers.brewery"+ 
     " FROM beer_flight_beers"+ 
      " INNER JOIN beers ON beer_flight_beers.beer_id = beers._id"+ 
      " INNER JOIN beer_flights ON beer_flight_beers.beer_flight_id = beer_flights._id"+ 
      " INNER JOIN beer_locations ON beer_flights.location_id = beer_locations.location_id AND beer_flight_beers.beer_id = beer_locations.beer_id"+ 
     " WHERE beer_flight_beers.beer_flight_id = ?"+ 
     " ORDER BY beers.name ASC"; 

Cursor cur = db.rawQuery(sql, new String[]{ flightId.toString() }); 

正如我所說,這完全在模擬器爲Android 2。 2+以及運行2.3.3的我的Droid 2和運行2.3.6的我的Droid 4。然而,當我在Android 2.1模擬器中運行相同的代碼,我得到以下錯誤:

Uncaught handler: thread main exiting due to uncaught exception 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.absolutemg.jlbeers/com.absolutemg.jlbeers.BeerFlights}: 
java.lang.IllegalArgumentException: column 'name' does not exist 

[snip] 

Caused by: java.lang.IllegalArgumentException: column 'name' does not exist 
at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314) 
at android.widget.SimpleCursorTreeAdapter.initFromColumns(SimpleCursorTreeAdapter.java:194) 
at android.widget.SimpleCursorTreeAdapter.initGroupFromColumns(SimpleCursorTreeAdapter.java:200) 
at android.widget.SimpleCursorTreeAdapter.init(SimpleCursorTreeAdapter.java:180) 
at android.widget.SimpleCursorTreeAdapter.<init>(SimpleCursorTreeAdapter.java:169) 
at com.absolutemg.jlbeers.BeerFlights$BeerFlightsExpandableListAdapter.<init>(BeerFlights.java:395) 
at com.absolutemg.jlbeers.BeerFlights.onCreate(BeerFlights.java:100) 

兩個光標有列_id。所以我不知道爲什麼我得到一個錯誤說column 'name' does not exist

我扭捏的事情來改變光標返回列flight_idflight_name,並相應地改變列表適配器。當我這樣做時,活動不再崩潰。它顯示了我的組名。但是,當我點擊這些組來打開它時,它再次關閉。

這些相同的更改導致活動強制關閉在Android 2.2+(我假設,因爲我沒有在我的光標名爲_id列)。所以這真的不是一個修復。

有沒有什麼不同的使用遊標或2.1 rawQuery()功能在2.2改變了嗎?關於如何解決這個問題,我在這裏完全失敗。

我很想放棄對此應用的Android 2.1支持,但我們確實有一些運行2.1的用戶(這只是我們用戶羣的1.26%,但我不想排除任何人從更新的應用)。的其他問題

無我已經在這裏找到了SO一直不太一樣這一點,我已經沒有運氣找到任何其他地方。有任何想法嗎?

+0

2.1可能與其他需求的較新手機有不同的sqlite版本。我想你已經檢查過這種情況,並且表名是小寫的「名字」? – znat 2012-08-10 16:10:56

+0

是的... sql查詢的情況是正確的。事實證明,我需要在我的查詢中做一個'beer_flights.name as name'。不知道爲什麼。也許是因爲它的前綴是表名。 ??? – Becky 2012-08-10 16:28:40

回答

0

我設法解決的事情......只是發佈後幾分鐘。解決方案讓我感覺自己像個傻瓜。:(

我修改了查詢我的光標明確設置列名,例如:

集團光標

SELECT beer_flights._id AS _id, beer_flights.name AS name, COUNT(beer_flight_beers.beer_id) AS beer_count 

子游標

SELECT DISTINCT beers._id AS _id, beers.name AS name, beers.brewery AS brewery 

後我這樣做了,一切都按照它在所有版本的Android t上的工作我正在測試的帽子。

沒有人有任何線索爲什麼我需要做的是爲Android 2.1,但不是任何更新的版本?這對我來說似乎很愚蠢,但那是固定的東西。

也許是因爲查詢的表名前綴列。這是我唯一的猜測。

+0

根據我的經驗,Android 2.1有一個錯誤的Sqlite實現。我有JOIN在2.1中完全不工作,在2.2以上工作正常。而且,既然你解決了這個問題,你應該繼續並接受你的答案。 – thatsmydoing 2012-08-10 16:36:21