SQLiteBindOrColumnIndexOutOfRangeException
?
首先贴出错误消息:
?
12-24 18:01:55.940: W/System.err(29565): android.database.sqlite.SQLiteBindOrColumnIndexOutOfRangeException: bind or column index out of range: handle 0x158e0b0 12-24 18:01:55.940: W/System.err(29565): at android.database.sqlite.SQLiteProgram.native_bind_string(Native Method) 12-24 18:01:55.940: W/System.err(29565): at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:385) 12-24 18:01:55.940: W/System.err(29565): at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:260) 12-24 18:01:55.940: W/System.err(29565): at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:84) 12-24 18:01:55.940: W/System.err(29565): at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1810) 12-24 18:01:55.940: W/System.err(29565): at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1761) 12-24 18:01:55.940: W/System.err(29565): at com.mychat.db.SQLiteTemplate.update(SQLiteTemplate.java:254) 12-24 18:01:55.940: W/System.err(29565): at com.mychat.manager.MessageManager.updateReceived(MessageManager.java:110) 12-24 18:01:55.940: W/System.err(29565): at com.mychat.manager.MyReceiptProvider.createReturnExtension(MyReceiptProvider.java:23) 12-24 18:01:55.940: W/System.err(29565): at org.jivesoftware.smack.provider.EmbeddedExtensionProvider.parseExtension(EmbeddedExtensionProvider.java:105) 12-24 18:01:55.940: W/System.err(29565): at org.jivesoftware.smack.util.PacketParserUtils.parsePacketExtension(PacketParserUtils.java:811) 12-24 18:01:55.940: W/System.err(29565): at org.jivesoftware.smack.util.PacketParserUtils.parseMessage(PacketParserUtils.java:142) 12-24 18:01:55.940: W/System.err(29565): at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:178) 12-24 18:01:55.940: W/System.err(29565): at org.jivesoftware.smack.PacketReader.access$000(PacketReader.java:46) 12-24 18:01:55.940: W/System.err(29565): at org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:72)
?
?
?
出现这样的消息一般是由于sql语句中的数据的个数没匹配上。
?
今天弄项目的时候,就遇到了这个问题,花了我一下午才解决,其实解决方法很简单,开始出现这个问题,我上网搜了资料,定位是这条数据库语句少了一些东西,可是我对比来对比去,都不觉得是少了什么。贴下我的代码:
?
SQLiteTemplate st = SQLiteTemplate.getInstance(manager, false);
ContentValues contentValues = new ContentValues();
contentValues.put("msg_received", isReceived);
st.update("im_msg_his", contentValues, "msg_id ",
new String[] { msg_id });
?
?
?
因为以前使用sqlite,都用的是很简单的sql语句,这次因为用的别人的源码,所以对高级一点的语句就不奈何了,我们来看:
SQLiteTemplate是写好的一个模板,而这条update则是调用sqlite系统封装好的:
?
/**
* 更新数据
*
* @param table 表的名称
* @param values contentValues 键值对
* @param whereClause 要更新的哪一行
* @param whereArgs 要替换的那行的数据
* @return 返回值大于0表示更新成功
*/
public int update(String table, ContentValues values, String whereClause,
String[] whereArgs) {
try {
dataBase = dBManager.openDatabase();
int result = dataBase.update(table, values, whereClause, whereArgs);
return result;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (!isTransaction) {
closeDatabase(null);
}
}
return 0;
}
?
折腾了一下午,终于发现不同了,没错,就是
?
st.update("im_msg_his", contentValues, "msg_id ",
new String[] { msg_id });
?
?这一句,我们只需要改成
st.update("im_msg_his", contentValues, "msg_id =?",
new String[] { msg_id });
?
?
就搞定了。哦,原来是这样子阿。
SQLiteBindOrColumnIndexOutOfRangeException
原文:http://zhonglunshun.iteye.com/blog/2169853