You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:43:12