0

一个非常简单的 SQL 语句不起作用,有什么想法吗?

rawQuery("SELECT * FROM " + CITY_TABLE + ";", columns);

来自堆栈跟踪的错误

android.database.sqlite.SQLiteBindOrColumnIndexOutOfRangeException:
bind or column index out of range: handle 0x19b098006-

其余的代码

public ArrayList<String> getCitiesFromCountry(int countryCode){
    String[] columns = new String[]{CITY_NAME};
    ArrayList<String> cityNames = new ArrayList<String>(); 
    Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM  " + CITY_TABLE + ";", columns);

    if (cursor != null){         
      while(cursor.moveToNext()){
         cityNames.add(cursor.getString(cursor.getColumnIndex(CITY_NAME)));
         ....
      }
      ...
    }
    return cityNames;
}

数据库常量

public static final String WORLD_DATABASE = "world_database";
public static final String COUNTRY_TABLE = "country_table";
public static final String CITY_TABLE = "city_table";
public static final int DATABASE_VERSION = 1;
public static final String _ID = "_id";
public static final String _ID2 = "_id2";
public static final String COUNTRY_NAME = "country_name";
public static final String CITY_NAME = "city_name";
4

5 回答 5

2

如果要检索所有列,则不需要 rawquery 中的第二个参数

rawQuery("SELECT * FROM " + CITY_TABLE , null);

如果你想检索特定的行,然后像这样使用......

rawQuery("SELECT COL1, COL2 FROM " + CITY_TABLE + " WHERE COL1 = ? AND COL2 = ?", new String[] {"CRUSADER", "CITY"});
于 2013-06-21T04:56:33.653 回答
2

对于原始查询,您不要为第二个参数放置列,因为这些列用于 where 参数。即有一个像这样的查询

db.rawQuery("SELECT * FROM " + CITY_TABLE + " WHERE city_name = ?;", new String[]{"Moon"});

如果您想让列来自字符串数组。您可以使用。

db.query(CITY_TABLE, COLUMNS, null, null, null, null, null);

这将为列选择 city_table

于 2013-06-21T04:56:48.160 回答
2

为什么需要columns在声明中?你不需要它:

rawQuery("SELECT * FROM " + CITY_TABLE, null);

如果你想传递选择参数,那么你应该使用它。例如,如果您只想选择那些行city_name = 'New York'

rawQuery("SELECT * FROM " + CITY_TABLE + " WHERE " + CITY_NAME + " = ?", new String[] {"New York"});

有关更多信息,请参阅内容。

于 2013-06-21T05:01:47.867 回答
1

您应该尝试删除';' 从选择查询中签名这可能是导致问题的原因,还要检查列数,列数也可能是原因。

于 2013-06-21T05:04:23.400 回答
0
Try to get the result using either of these two methods
      while(cursor.moveToNext()){
      cityNames.add(cursor.getString(Column_Name);
      or 
      cityNames.add(cursor.getString(ColumnIndex); 
      }

在原始查询中,您可以很好地删除第二个参数并将其替换为 null。db.rawQuery("Select * from "+Table_Name,null);

于 2013-06-21T05:07:19.487 回答