Android 列“objectId”不存在异常(仅在emulator中)
我的应用程序有一个非常奇怪的问题,我不知道为什么它只发生在emulator中。我使用的是一个自定义的数据库助手类,没有任何问题。但我经常使用的数据库表中的特定列有一个问题。因此,根据我从父活动发送的一些额外信息,我正在运行不同的sql语句。以下是我正在使用的:Android 列“objectId”不存在异常(仅在emulator中),android,database,Android,Database,我的应用程序有一个非常奇怪的问题,我不知道为什么它只发生在emulator中。我使用的是一个自定义的数据库助手类,没有任何问题。但我经常使用的数据库表中的特定列有一个问题。因此,根据我从父活动发送的一些额外信息,我正在运行不同的sql语句。以下是我正在使用的: String sql = ""; switch (sort) { case 1: if (extra != 0) { sql = "SELECT DISTINCT c
String sql = "";
switch (sort) {
case 1:
if (extra != 0) {
sql = "SELECT DISTINCT c.objectId FROM cards AS c "
+ "INNER JOIN cardtags AS ct "
+ "ON (c.objectId=ct.cardId) "
+ "WHERE c.collectionId="
+ collId
+ " AND c.repeatsCount>0"+ " AND ct.tagId="
+ extra;
} else if (extra == 0) {
sql = "SELECT DISTINCT c.objectId FROM cards AS c "
+ "INNER JOIN cardtags AS ct "
+ "ON (c.objectId=ct.cardId) "
+ "WHERE c.collectionId="
+ collId
+ " AND c.repeatsCount>0";
}
break;
case 2:
if (extra != 0) {
sql = "SELECT DISTINCT cd.objectId FROM cards AS cd "
+ "INNER JOIN categories AS ct "
+ "ON (cd.categoryId=ct.objectId) "
+ "WHERE cd.collectionId="
+ collId
+ " AND ct.objectId="
+ extra
+ " AND cd.repeatsCount>0";
} else if (extra == 0) {
sql = "SELECT DISTINCT cd.objectId FROM cards AS cd "
+ "INNER JOIN categories AS ct "
+ "ON (cd.categoryId=ct.objectId) "
+ "WHERE cd.collectionId="
+ collId
+ " AND cd.repeatsCount>0";
}
break;
case 3:
String AscDesc = "";
if (ascDesc == 0) {
AscDesc = "ASC";
sql = "SELECT DISTINCT objectId FROM cards "
+ "WHERE collectionId="
+ collId
+ " AND repeatsCount>0"
+ " ORDER BY dateCreated "
+ AscDesc;
} else if (ascDesc != 0) {
AscDesc = "DESC";
sql = "SELECT DISTINCT objectId FROM cards "
+ "WHERE collectionId="
+ collId
+ " AND repeatsCount>0"
+ " ORDER BY dateCreated "
+ AscDesc;
}
break;
}
Cursor myCursor = userDbHelper.executeSQLQuery(sql);
if (myCursor.getCount() == 0) {
myCursor.close();
} else if (myCursor.getCount() > 0) {
myCardID = new ArrayList<Integer>();
myCardID.clear();
for (myCursor.move(0); myCursor.moveToNext(); myCursor.isAfterLast()) {
int cardId1 = myCursor.getInt(myCursor.getColumnIndexOrThrow("objectId"));
myCardID.add(cardId1);
}
}
当我尝试启动这个活动时,它只会在EMULATOR中抛出一个异常,在真实的设备上——HTC Desire、HTC EVO 3D并没有问题
11-30 14:51:18.899:E/AndroidRuntime14818:原因:java.lang.IllegalArgumentException:列“objectId”不存在
联机:int cardId1=myCursor.getIntmyCursor.getColumnIndexOrThrowobjectId
但奇怪的是,当我从emulator下载数据库文件并打开它时,我可以清楚地看到我在那里有一个列objectId,我也在其他文件中使用该列,但它并没有引发异常。所以我想知道这是某种模拟器错误,因为我在设备上没有得到类似的东西,或者可能我做错了什么
有什么想法吗?问题是select语句中列的别名。只有在案例3中,游标才实际包含名为objectId的列,因此当您执行myCursor.getColumnIndexOrThrowobjectId时,它会引发异常
在案例1中,光标中的列是c,在案例2中是cards 您是否尝试过重新创建/升级数据库?我在每个应用程序启动时都会创建数据库,当我查看sqlite文件时,我可以看到列objectId。您是否尝试过枚举列名以查看光标中的实际内容?在某些情况下,objectId是否可以称为“c.objectId”?onCreate事件仅在首次创建数据库时调用,但并不总是如此,因此,您可以尝试从emulator卸载应用程序,然后重新安装它。在某些情况下,我使用的是c.objectId,但它在设备上没有显示错误,据我所知,它不应该在那里引发异常。