我有延伸ExpandableListActivity
的活動。當我在Android 2.2+上運行應用程序時,我沒有任何問題。然而,當我在Android 2.1模擬器中運行它,這個活動強制關閉(在應用程序中的其他活動都沒有問題)。我完全難倒了。SimpleCursorAdapter錯誤:列不存在 - 不僅發生在Android 2.1的
我創建了一個自定義適配器與擴展SimpleCursorTreeAdapter
的ExpandableListView
使用。我使用下面的代碼設置列表適配器:
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_id和flight_name,並相應地改變列表適配器。當我這樣做時,活動不再崩潰。它顯示了我的組名。但是,當我點擊這些組來打開它時,它再次關閉。
這些相同的更改導致活動強制關閉在Android 2.2+(我假設,因爲我沒有在我的光標名爲_id列)。所以這真的不是一個修復。
有沒有什麼不同的使用遊標或2.1 rawQuery()
功能在2.2改變了嗎?關於如何解決這個問題,我在這裏完全失敗。
我很想放棄對此應用的Android 2.1支持,但我們確實有一些運行2.1的用戶(這只是我們用戶羣的1.26%,但我不想排除任何人從更新的應用)。的其他問題
無我已經在這裏找到了SO一直不太一樣這一點,我已經沒有運氣找到任何其他地方。有任何想法嗎?
2.1可能與其他需求的較新手機有不同的sqlite版本。我想你已經檢查過這種情況,並且表名是小寫的「名字」? – znat 2012-08-10 16:10:56
是的... sql查詢的情況是正確的。事實證明,我需要在我的查詢中做一個'beer_flights.name as name'。不知道爲什麼。也許是因爲它的前綴是表名。 ??? – Becky 2012-08-10 16:28:40