Android开发中SQLite保存图片路径触发NOT NULL约束异常的问题求助
问题排查与解决方案
从你给出的异常信息和代码来看,核心问题出在onActivityResult方法的判断逻辑上,导致pathToImage始终没有被正确赋值,最终插入数据库时触发了非空约束异常。
关键错误点
你在onActivityResult的case Pick_image分支里写了:
if(requestCode == RESULT_OK){
这里完全搞混了requestCode和resultCode的含义:
requestCode是你启动Activity时传入的标识(也就是你的Pick_image常量),用来区分不同的启动请求;resultCode才是返回的结果状态,RESULT_OK表示用户成功完成了操作(比如选中了图片)。
因为这个错误,当用户选择图片返回后,判断条件永远不成立,里面的pathToImage = imageUri.toString();根本不会执行,pathToImage还是初始的null,插入数据库时自然就触发了NOT NULL constraint failed异常。
修正后的代码
把onActivityResult里的判断条件改成resultCode == RESULT_OK,同时加上imageReturnedIntent非空校验,避免空指针:
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent imageReturnedIntent) { super.onActivityResult(requestCode, resultCode, imageReturnedIntent); switch (requestCode){ case Pick_image: // 修正判断条件,同时校验Intent非空 if(resultCode == RESULT_OK && imageReturnedIntent != null){ try { final Uri imageUri = imageReturnedIntent.getData(); final InputStream imageStream = getContentResolver().openInputStream(imageUri); final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream); Log.e("mLog", "onActivityResult: " + imageStream + " " + imageReturnedIntent + " " + imageUri); pathToImage = imageUri.toString(); } catch (FileNotFoundException e){ e.printStackTrace(); } } break; // 加上break,避免后续case意外执行 } }
额外优化建议
- 初始化
pathToImage:建议在定义pathToImage时给一个初始值(比如空字符串),避免未赋值的情况:private String pathToImage = ""; - 插入前校验:在执行数据库插入操作前,先检查
pathToImage是否有效,给用户友好提示:if(TextUtils.isEmpty(pathToImage)){ Toast.makeText(getApplicationContext(), "请先选择图片", Toast.LENGTH_SHORT).show(); return; } // 再执行插入逻辑 ContentValues cv = new ContentValues(); ... - 注意URI的使用:
imageUri.toString()得到的是内容URI(比如content://media/external/images/media/XXX),如果后续你需要直接操作文件,可能需要将其转换为真实的文件路径,但如果只是用来加载显示图片,直接用这个URI是没问题的。
内容的提问来源于stack exchange,提问作者Daniil Vlasov
相关产品推荐
相关产品推荐

