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
相关产品推荐
相关产品推荐

