rawquery方法中的SQL语句不起作用

时间:2013-06-21 04:51:46

标签: android database sqlite

一个非常简单的SQL语句无效,有什么想法吗?

rawQuery("SELECT * FROM " + CITY_TABLE + ";", columns);
来自stacktrace的

错误

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";

5 个答案:

答案 0 :(得分:2)

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

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

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

rawQuery("SELECT COL1, COL2 FROM " + CITY_TABLE + " WHERE COL1 = ? AND COL2 = ?", new String[] {"CRUSADER", "CITY"});

答案 1 :(得分:2)

对于原始查询,您不要将第二个参数的列放在第二个参数的列中。即有一个像

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

如果您希望列来自字符串数组。你可以使用。

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

这将为列

选择city_table

答案 2 :(得分:2)

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

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

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

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

有关详细信息,请参阅this

答案 3 :(得分:1)

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

答案 4 :(得分: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);