SQLiteBindOrColumnIndexOutOfRangeException
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 });
?
?
就搞定了。哦,原来是这样子阿。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。