簡體   English   中英

SimpleCursorAdapter錯誤:列不存在-僅在Android 2.1中發生

[英]SimpleCursorAdapter error: column does not exist - only happens in Android 2.1

我有一個擴展ExpandableListActivity的活動。 在Android 2.2+上運行應用程序時,我沒有任何問題。 但是,當我在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)

兩個游標都有_idname列。 所以我不確定為什么我會收到錯誤消息,說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中找到的其他問題都沒有與此完全相同的地方,而且我在其他任何地方都找不到運氣。 有任何想法嗎?

發布后僅幾分鍾,我就設法解決了問題。 解決方案使我感到自己像個傻瓜。 :(

我修改了游標查詢以顯式設置列名,如下所示:

組光標

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中的所有版本,我測試的假定。

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

可能是因為查詢的表名以列為前綴。 這是我目前唯一的猜測。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM