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

Android存储文本文件到SQLite出现NOT NULL约束失败错误如何解决

问题根因

你创建的表定义了POSITION字段为TEXT NOT NULL非空约束,但你调用db.insert提交的ContentValues中没有为该字段赋值,违反非空约束触发报错。


解决方法1:补充POSITION字段赋值

如果POSITION字段是业务需要保留的:

  1. 修改add_txt_file方法,新增position入参
// 修改方法签名,新增position参数
public boolean add_txt_file(String id, byte[] txt_file, String position) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(_ID,id);
    cv.put(TXT_FILE,txt_file);
    cv.put(POSITION, position); // 补充非空字段赋值
    long result = db.insert(TABLE_NAME,null,cv);
    return result != -1;
}
  1. 调用方法时传入对应位置值即可,比如你当前的文件路径就可以作为POSITION值传入:
boolean save_txt_file = db.add_txt_file(id, readFile(path), path);

解决方法2:修改表结构,取消POSITION的非空约束/删除无用字段

如果POSITION字段没有业务用途,修改建表语句:

@Override
public void onCreate(SQLiteDatabase db) {
    // 要么去掉POSITION字段的NOT NULL约束,要么直接删掉这个字段
    String create_table = "CREATE TABLE " + TABLE_NAME + "( "
            + "ID INTEGER PRIMARY KEY ,"
            + POSITION + " TEXT, " // 去掉NOT NULL
            + TXT_FILE + " BLOB NOT NULL, "
            + _ID + " TEXT NOT NULL)";
    db.execSQL(create_table);
}

注意:修改表结构后需要卸载App重新安装触发onCreate执行,或者做数据库版本升级逻辑,否则老表结构不会更新。


额外注意事项

你的readFile方法异常时会返回null,而TXT_FILE是非空字段,建议调用add_txt_file前先判断readFile返回值是否为null,避免后续又触发同类非空报错。

内容的提问来源于stack exchange,提问作者a awasi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:54:03