SQLite报错:AUTOINCREMENT仅允许用于INTEGER PRIMARY KEY问题求助
解决SQLite中AUTOINCREMENT仅允许用于INTEGER PRIMARY KEY的崩溃问题
先看你抛出的错误日志:
E/Surface: getSlotFromBufferLocked: 未知缓冲区: 0xaa1d1780 D/EGL_emulation: eglMakeCurrent: 0xae494780: ver 2 0 (tinfo 0xae4b0400) E/SQLiteLog: (1) AUTOINCREMENT仅允许用于INTEGER PRIMARY KEY D/AndroidRuntime: 正在关闭VM E/AndroidRuntime: 致命异常: main 进程: com.example.harshpatel.asktoaexpert, PID: 14728 android.database.sqlite.SQLiteException: AUTOINCREMENT仅允许用于INTEGER PRIMARY KEY (错误码1): , 编译时出错: CREATE TABLE IF NOT EXISTS UserTab...
这个崩溃的核心原因非常明确:SQLite的AUTOINCREMENT关键字只能搭配INTEGER PRIMARY KEY使用,你的UserTab表创建语句违反了这个硬性规则。
常见错误写法示例
你大概率是写成了以下两种错误形式之一:
- 未指定主键类型为INTEGER:
CREATE TABLE IF NOT EXISTS UserTab ( id PRIMARY KEY AUTOINCREMENT, -- 缺少INTEGER类型声明 username TEXT, ... );
- 主键类型不是INTEGER(比如VARCHAR、INT等):
CREATE TABLE IF NOT EXISTS UserTab ( id VARCHAR PRIMARY KEY AUTOINCREMENT, -- 类型错误,非INTEGER ... );
正确的表结构写法
按照SQLite的规则,必须把主键声明为INTEGER PRIMARY KEY AUTOINCREMENT,示例如下:
CREATE TABLE IF NOT EXISTS UserTab ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, email TEXT, -- 其他字段按需添加 );
额外优化建议
其实如果你的需求只是自增主键,SQLite中INTEGER PRIMARY KEY本身就会自动生成唯一的自增ID,不需要显式添加AUTOINCREMENT关键字。只有当你需要严格保证主键不会复用之前被删除的ID时,才需要加上AUTOINCREMENT(它会额外维护一个sqlite_sequence表,性能略低)。所以如果没有特殊需求,也可以简化成:
CREATE TABLE IF NOT EXISTS UserTab ( id INTEGER PRIMARY KEY, -- 自动自增,无需AUTOINCREMENT username TEXT NOT NULL, ... );
修改完表创建语句后,记得卸载重新安装应用(或者清空应用数据),让新的表结构生效,就能解决这个崩溃问题了。
内容的提问来源于stack exchange,提问作者Harsh Patel
相关产品推荐
相关产品推荐

