0

我有一个扩展的活动ExpandableListActivity。我在 Android 2.2+ 上运行应用程序时没有任何问题。但是,当我在 Android 2.1 模拟器上运行它时,此活动强制关闭(应用程序中的其他活动没有问题)。我完全被难住了。

我创建了一个自定义适配器来与ExpandableListViewthat extends一起使用SimpleCursorTreeAdapter。我正在使用以下代码设置列表适配器:

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的列)。所以这真的不是解决办法。

rawQuery()游标或 2.1 中的功能在 2.2 中是否有所不同?我完全不知道如何解决这个问题。

我很想放弃对这个应用程序对 Android 2.1 的支持,但我们确实有一些用户在运行 2.1(它仅占我们用户群的 1.26% 左右,但我不想将任何人排除在更新的应用程序之外)。

我在 SO 中找到的其他问题都与此完全相同,而且我在其他任何地方都没有找到任何东西。有任何想法吗?

4

1 回答 1

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 版本中,一切都按预期工作。

有谁知道为什么我需要为 Android 2.1 而不是任何更高版本这样做?这对我来说似乎很愚蠢,但这就是解决问题的方法。

可能是因为查询的表名在列前面。这是我目前唯一的猜测。

于 2012-08-10T16:26:43.530 回答