Android存储文本文件到SQLite出现NOT NULL约束失败错误如何解决
问题根因
你创建的表定义了POSITION字段为TEXT NOT NULL非空约束,但你调用db.insert提交的ContentValues中没有为该字段赋值,违反非空约束触发报错。
解决方法1:补充POSITION字段赋值
如果POSITION字段是业务需要保留的:
- 修改
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; }
- 调用方法时传入对应位置值即可,比如你当前的文件路径就可以作为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
相关产品推荐
相关产品推荐

