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

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表创建语句违反了这个硬性规则。

常见错误写法示例

你大概率是写成了以下两种错误形式之一:

  1. 未指定主键类型为INTEGER:
CREATE TABLE IF NOT EXISTS UserTab (
    id PRIMARY KEY AUTOINCREMENT, -- 缺少INTEGER类型声明
    username TEXT,
    ...
);
  1. 主键类型不是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:34:12