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 });

?

?

就搞定了。哦,原来是这样子阿。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。