·11-17 03:28:34.282 16636-16636/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: kaurihealth.mobile.andirod.interaltest, PID: 16636
android.database.sqlite.SQLiteException: table conversations has no column named last_message (code 1): , while compiling: INSERT OR REPLACE INTO conversations(last_message,creator,isTransient,members,expireAt,conversation_id,lm,attr,updatedAt,createdAt) VALUES (?,?,?,?,?,?,?,?,?,?)
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteStatement.(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
at com.avos.avoscloud.im.v2.AVIMMessageStorage.insertConversations(AVIMMessageStorage.java:574)
at com.avos.avoscloud.im.v2.AVIMConversation$14.done(AVIMConversation.java:864)
at com.avos.avoscloud.GetCallback.internalDone0(GetCallback.java:44)
at com.avos.avoscloud.GetCallback.internalDone0(GetCallback.java:34)
at com.avos.avoscloud.AVCallback$1.run(AVCallback.java:12)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)·

你好,请更新 SDK 到最新的 v3.15.1,已修复此问题。

values.put("last_message", lastMessage);
values.put("members", JSON.toJSONString(conversation.getMembers()));
values.put("isTransient", Integer.valueOf(conversation.isTransient?1:0));
values.put("conversation_id", conversation.getConversationId());
db.insertWithOnConflict("conversations", (String)null, values, 5); 你们这块代码还是有问题啊

我已经更新到3.15.1了,但是还是崩溃,
android.database.sqlite.SQLiteException: table conversations has no column named last_message (code 1): , while compiling: INSERT OR REPLACE INTO conversations(last_message,creator,isTransient,members,expireAt,conversation_id,lm,attr,updatedAt,createdAt) VALUES (?,?,?,?,?,?,?,?,?,?)
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteStatement.(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
at com.avos.avoscloud.im.v2.AVIMMessageStorage.insertConversations(AVIMMessageStorage.java:599)
at com.avos.avoscloud.im.v2.AVIMConversation$14.done(AVIMConversation.java:864)
at com.avos.avoscloud.GetCallback.internalDone0(GetCallback.java:44)
at com.avos.avoscloud.GetCallback.internalDone0(GetCallback.java:34)
at com.avos.avoscloud.AVCallback$1.run(AVCallback.java:12)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5275)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)

我这里测试是没有问题的,你那边是不是因为没有 gradle clean 或者 sync 导致实际 apk 中的版本没有更新?你在 clean 一下然后 rebuild 一下试试?

你试试从老版本更新 你看看他的源码写的就有问题。

崩溃啊 我上面不是贴了么!

“table conversations has no column named last_message (code 1)” 这个是因为没有 add column 导致。这里 3.15.1 已经修复了。

这里仍然报错有可能是因为本地 app 已经升级到 3.15 了,所以才导致 onUpgrade 没有执行导致,但是这种情况应该只存在于你现在的 app。你可以先把本地的 app 删掉,使用 3.14.10 打个包,然后安装正常聊天,然后升级到 3.15.1,然后覆盖安装 app,这个时候应该是没有问题的。

如果木有问题了告诉我一声哈,有问题随时反馈。

我调用conversation.getAttribute(Global.LeanCloud.ATTR)/conversation.get(Global.LeanCloud.ATTR_MEMBERS)等等
获取不到值,返回null

这是两个问题哈。
1、上边 sqlite 的问题是否解决?
2、AVIMConversation 需要先 fetchInfoInBackground 后才会把 server 端的数据拉取到本地,这时候 getAttribute 才能获取到值。

sqlite 暂时无法测试,我把历史数据库都的清空了
fetchInfoInBackground 我知道这个操作,它有个判断嘛 我在这之前 conversation.getCreatedAt() == null时就调用这个,

11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: com.avos.avoscloud.im.v2.AVIMException: com.avos.avoscloud.AVException: android.database.sqlite.SQLiteException: no such column: dtoken (code 1): , while compiling: SELECT * FROM messages WHERE conversation_id = ? and dtoken = ?
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at com.avos.avoscloud.im.v2.callback.AVIMConversationCallback.internalDone0(AVIMConversationCallback.java:21)
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at com.avos.avoscloud.im.v2.callback.AVIMConversationCallback.internalDone0(AVIMConversationCallback.java:10)
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at com.avos.avoscloud.AVCallback.internalDone(AVCallback.java:18)
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at com.avos.avoscloud.im.v2.AVIMBaseBroadcastReceiver.onReceive(AVIMBaseBroadcastReceiver.java:32)
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297)
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46)
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:116)
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at android.os.Handler.dispatchMessage(Handler.java:99)
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at android.os.Looper.loop(Looper.java:137)
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5457)
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at java.lang.reflect.Method.invokeNative(Native Method)
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at java.lang.reflect.Method.invoke(Method.java:525)
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:806)
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at dalvik.system.NativeStart.main(Native Method)
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: Caused by: com.avos.avoscloud.AVException: android.database.sqlite.SQLiteException: no such column: dtoken (code 1): , while compiling: SELECT * FROM messages WHERE conversation_id = ? and dtoken = ?
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: ... 12 more
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: Caused by: android.database.sqlite.SQLiteException: no such column: dtoken (code 1): , while compiling: SELECT * FROM messages WHERE conversation_id = ? and dtoken = ?
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
11-18 01:45:44.388 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:891)
11-18 01:45:44.398 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:502)
11-18 01:45:44.398 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
11-18 01:45:44.398 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
11-18 01:45:44.398 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
11-18 01:45:44.398 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
11-18 01:45:44.398 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
11-18 01:45:44.398 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161)
11-18 01:45:44.398 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
11-18 01:45:44.398 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1200)
11-18 01:45:44.398 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at com.avos.avoscloud.im.v2.AVIMMessageStorage.insertLocalMessage(AVIMMessageStorage.java:200)
11-18 01:45:44.398 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at com.avos.avoscloud.im.v2.AVIMConversation$16.execute(AVIMConversation.java:1025)
11-18 01:45:44.398 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: at com.avos.avoscloud.im.v2.AVIMBaseBroadcastReceiver.onReceive(AVIMBaseBroadcastReceiver.java:27)
11-18 01:45:44.398 7630-7630/kaurihealth.mobile.andirod.interaltest W/System.err: ... 11 more
11-18 01:45:44.408 7630-7630/kaurihealth.mobile.andirod.interaltest E/LCChatKit: com.kaurihealth.chatlib.activity.ConversationActivity$7 done():554
com.avos.avoscloud.im.v2.AVIMException: com.avos.avoscloud.AVException: android.database.sqlite.SQLiteException: no such column: dtoken (code 1): , while compiling: SELECT * FROM messages WHERE conversation_id = ? and dtoken = ?
at com.avos.avoscloud.im.v2.callback.AVIMConversationCallback.internalDone0(AVIMConversationCallback.java:21)
at com.avos.avoscloud.im.v2.callback.AVIMConversationCallback.internalDone0(AVIMConversationCallback.java:10)
at com.avos.avoscloud.AVCallback.internalDone(AVCallback.java:18)
at com.avos.avoscloud.im.v2.AVIMBaseBroadcastReceiver.onReceive(AVIMBaseBroadcastReceiver.java:32)
at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297)
at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46)
at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:116)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5457)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:806)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
at dalvik.system.NativeStart.main(Native Method)
Caused by: com.avos.avoscloud.AVException: android.database.sqlite.SQLiteException: no such column: dtoken (code 1): , while compiling: SELECT * FROM messages WHERE conversation_id = ? and dtoken = ?
at com.avos.avoscloud.im.v2.AVIMBaseBroadcastReceiver.onReceive(AVIMBaseBroadcastReceiver.java:32)
at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297)
at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46)
at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:116)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5457)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:806)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.database.sqlite.SQLiteException: no such column: dtoken (code 1): , while compiling: SELECT * FROM messages WHERE conversation_id = ? and dtoken = ?
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:891)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:502)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1200)
at com.avos.avoscloud.im.v2.AVIMMessageStorage.insertLocalMessage(AVIMMessageStorage.java:200)
at com.avos.avoscloud.im.v2.AVIMConversation$16.execute(AVIMConversation.java:1025)
at com.avos.avoscloud.im.v2.AVIMBaseBroadcastReceiver.onReceive(AVIMBaseBroadcastReceiver.java:27)
at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297)
at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46)
at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:116)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5457)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:806)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
at dalvik.system.NativeStart.main(Native Method)
11-18 01:46:14.418 7630-7630/kaurihealth.mobile.andirod.interaltest E/MediaPlayer: stop called in state 0
11-18 01:46:48.498 7630-7630/kaurihealth.mobile.andirod.interaltest E/MediaPlayer: stop called in state 0

我还是怀疑是你版本没有安装对,我刚又看了一下代码,应该是不会再有这个问题的。

你那边是不是因为没有 gradle clean 或者 sync 导致实际 apk 中的版本没有更新?你在 clean 一下然后 rebuild 一下试试?

注意:这里仍然报错有可能是因为本地 app 已经升级到 3.15 了,所以才导致 onUpgrade 没有执行导致,但是这种情况应该只存在于你现在的 app。你可以先把本地的 app 删掉,使用 3.14.10 打个包,然后安装正常聊天,然后升级到 3.15.1,然后覆盖安装 app,这个时候应该是没有问题的。

我的conversation.getAttribute还是拿不到数据

conversation.getCreatedAt()== Fri Nov 18 02:30:55 GMT+00:00 2016
然后
conversation.fetchInfoInBackground(new AVIMConversationCallback() {
..
conversation.getCreatedAt()==还是 Fri Nov 18 02:30:55 GMT+00:00 2016
conversation.getAttribute(key) ==null 为null
能分析下怎么回事吗?