Android SQLite中mtime字段存在却返回-1的问题求助
问题分析与解决建议
我先来帮你梳理下可能导致mtime字段获取返回-1的原因,结合你的代码和截图信息,给出几个针对性的解决方向:
首先贴出你定义的数据库表Schema代码:
package com.messaging.chatify.Schema; public class Messages { public static final String TABLE_MESSAGES = "chats"; public static final String MESSAGE_ID = "_id"; public static final String MESSAGE_TEXT = "text"; public static final String MESSAGE_ATTACHMENT = "attachement"; public static final String MESSAGE_SENDER = "msgfrom"; public static final String MESSAGE_RECEIVER = "msgto"; public static final String MESSAGE_ISREAD = "isRead"; public static final String MESSAGE_TIME = "mtime"; public static final String[] ALL_COLUMNS = { MESSAGE_ID, MESSAGE_TEXT, MESSAGE_ATTACHMENT, MESSAGE_SENDER, MESSAGE_RECEIVER, MESSAGE_ISREAD }; public static final String CREATE_STATEMENT = "CREATE TABLE IF NOT EXISTS " + TABLE_MESSAGES + "(" + MESSAGE_ID + " TEXT PRIMARY KEY, " + MESSAGE_TIME + " TEXT, " + MESSAGE_TEXT + " TEXT, " + MESSAGE_ATTACHMENT + " TEXT, " + MESSAGE_SENDER + " TEXT, " + MESSAGE_RECEIVER + " TEXT, " + MESSAGE_ISREAD + " INTEGER" + ");"; public static final String DROP_STATEMENT = "DROP TABLE IF EXISTS " + TABLE_MESSAGES; }
从你提供的SQLite Browser截图可以确认:表结构中确实存在
mtime字段,且数据表中该字段有有效数据。
最可能的问题:查询时未包含mtime字段
看你的ALL_COLUMNS数组,发现没有包含MESSAGE_TIME(也就是mtime)。如果你在查询数据库时,使用了这个数组来指定要查询的列(比如db.query(TABLE_MESSAGES, ALL_COLUMNS, ...)),那么返回的游标里根本就不会有mtime字段,调用cursor.getColumnIndex(MESSAGE_TIME)自然会返回-1。
解决办法很简单:把MESSAGE_TIME添加到ALL_COLUMNS数组中:
public static final String[] ALL_COLUMNS = { MESSAGE_ID, MESSAGE_TEXT, MESSAGE_ATTACHMENT, MESSAGE_SENDER, MESSAGE_RECEIVER, MESSAGE_ISREAD, MESSAGE_TIME // 添加这一行 };
其他可能的排查方向
如果上面的修改后问题依然存在,可以检查以下几点:
- 确认查询语句是否包含
mtime:如果你是手动编写SELECT语句(比如db.rawQuery("SELECT _id, text FROM chats", null)),要确保语句里明确包含mtime(或者用SELECT *来查询所有列)。 - 检查字段名拼写一致性:确保代码中获取字段时使用的是定义好的常量
MESSAGE_TIME,而不是硬写的字符串(比如避免写成"Mtime"或者"time")——虽然SQLite对表名/列名大小写不敏感,但Cursor.getColumnIndex()是大小写敏感的。 - 验证数据库升级逻辑:如果
mtime是后来添加的字段,要确认SQLiteOpenHelper的onUpgrade方法中执行了正确的表结构更新(比如ALTER TABLE chats ADD COLUMN mtime TEXT;),避免应用使用的还是旧版本的数据库表结构。
内容的提问来源于stack exchange,提问作者Muhammad Ali
相关产品推荐
相关产品推荐

