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

Android联系人App调试时SQLite主键ID重复显示0的问题

解决SQLite主键重复显示为0的问题

嘿,我来帮你搞定这个主键全是0的坑!这种情况一般是主键的自增配置或者数据读写环节出了问题,咱们一步步排查:

1. 先检查表结构的主键定义

这是最常见的原因!SQLite里要实现主键自动递增,必须严格用INTEGER PRIMARY KEY AUTOINCREMENT的定义——注意是INTEGER类型(不是INT),还要加上AUTOINCREMENT关键字。如果你的建表语句里主键只是INT PRIMARY KEY,那插入数据时没指定主键值的话,SQLite不会自动生成递增ID,反而会默认填0,自然就全是重复的0了。

正确的建表语句示例:

CREATE TABLE " + Util.TABLE_NAME + " (
    " + Util.COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,
    " + Util.COLUMN_NAME + " TEXT,
    " + Util.COLUMN_PHONE + " TEXT
    -- 其他字段按需添加
);

2. 确认读取数据时是否正确获取主键

看你贴的代码片段,创建Contact对象后没有读取主键的逻辑,这很可能是问题所在!你需要从Cursor里取出主键列的值,赋值给Contact的id字段,比如:

if (cursor.moveToFirst()){
    do {
        Contact contact = new Contact();
        // 关键:读取主键值,替换成你实际的主键列名
        contact.setId(cursor.getInt(cursor.getColumnIndex(Util.COLUMN_ID)));
        // 读取其他字段...
        contactList.add(contact);
    } while (cursor.moveToNext());
}

这里要注意getColumnIndex的参数必须和你表中主键列的名称完全一致,写错的话会返回-1,导致取到默认的0值。

3. 检查插入数据的逻辑

如果插入数据时手动把主键设为0,那SQLite就会直接存储0,不会生成自增ID。所以插入时不要给主键列赋值,或者传null,让SQLite自动生成:

public long addContact(Contact contact) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    // 删掉这行:values.put(Util.COLUMN_ID, 0);
    values.put(Util.COLUMN_NAME, contact.getName());
    values.put(Util.COLUMN_PHONE, contact.getPhone());
    // insert方法返回的就是自动生成的主键ID,可以打印出来验证
    long insertedId = db.insert(Util.TABLE_NAME, null, values);
    db.close();
    return insertedId;
}

按照这三步排查,应该就能解决主键全是0的问题啦!

内容的提问来源于stack exchange,提问作者Muhamad Jalal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:54:50