1. 程式人生 > >java.lang.IllegalArgumentException: the bind value at index 1 is null

java.lang.IllegalArgumentException: the bind value at index 1 is null

java.lang.IllegalArgumentException: the bind value at index 1 is null
           at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:164)

自定義相機拍攝了多張圖片,儲存到本地並新增到系統相簿,然後在自定義的相簿中瀏覽拍攝的圖片並刪除的時候第一張沒問題,刪第二張就報上面的異常了。

刪除圖片的方法除了刪除本地的圖片file,同時也刪除資料庫中該資料。看資訊是由個值為空。檢視日誌:

E/PhotoAlbumDetailActvty2: deleteImage,imgRealPath:/storage/emulated/0/faceallRecog/IMG_20171204_214942.jpg,imgPathcontent://media/external/images/media/27706
E/PhotoAlbumDetailActvty2: deleteImage,imgRealPath:null,imgPathcontent://media/external/images/media/27706
第一行是刪除的第一張圖片,第二行是刪除的第二張圖片,可以看到imgRealPath為null,而imgPath為第一張圖片的。

在看刪除的方法:

private void deleteImage(String imgPath) {
        String imgRealPath = getRealPathFromUri(activity, Uri.parse(imgPath));
        Log.e(TAG, "deleteImage,imgRealPath:" + imgRealPath + ",imgPath" + imgPath);
        ContentResolver resolver = activity.getContentResolver();
        Cursor cursor = MediaStore.Images.Media.query(resolver, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=?",
                new String[]{imgRealPath}, null);
可知是刪除第二張圖片時傳入的引數imgPath是第一張圖片的路徑,而第一張已經刪除,導致imgRealPath為空。
本人是用viewPager顯示的圖片,圖片刪除後viewPager自動顯示下一張圖片。

在上面的寫法中,圖片刪除後deleteImage(String imgPath)中imgPath依舊是被刪除的圖片路徑,在繼續刪除時會報上面的異常。

現修改為:

private int selectIndex;//選擇的圖片的下標

private void getImgUriStr(final int index) { //該方法是在adapter中呼叫,從adapter點選中獲取index資料,傳給selectIndex
        selectIndex=index;
        Log.e("selectIndex",selectIndex+"");
 //刪除圖片
    private void deleteImage() {
        //解決自定義相機拍攝多張照片後檢視圖片並刪除多張圖片時崩潰的問題。刪除圖片會導致圖片的總數發生變化,傳入selectIndex獲取最新的圖片uri。
        selectImgUri = currentLabelList.get(selectIndex).getOriginalUri();
        imgId = currentLabelList.get(selectIndex).getMediaID();
        String imgRealPath = getRealPathFromUri(activity, Uri.parse(selectImgUri));
        Log.e(TAG, "deleteImage,imgRealPath:" + imgRealPath + ",selectImgUri:"+selectImgUri);
        ContentResolver resolver = activity.getContentResolver();
        Cursor cursor = MediaStore.Images.Media.query(resolver, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=?",
                new String[]{imgRealPath}, null);
        boolean result = false;
        if (cursor!=null&&cursor.moveToFirst()) {
            long id = cursor.getLong(0);
            Uri contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            Uri uri = ContentUris.withAppendedId(contentUri, id);
            int count = activity.getContentResolver().delete(uri, null, null);
            activity.getContentResolver().notifyChange(uri, null);
            result = count == 1;
        } else {
            File file = new File(imgRealPath);
            result = file.delete();
        }
        //如果要刪除的圖片是收藏的圖片,則要從收藏的表裡刪除
        if (favFlag) {
            helper.deleteFavouritesImg(imgId);
        }

        if (result) {
            //把該圖片從list中刪除並重新整理
            removeFromList(currentLabelList, imgId);
            //這個方法不能刪除list中的元素
//            currentLabelList.remove(imgPath);
            myAdapter.notifyDataSetChanged();
            viewPagerAdapter.notifyDataSetChanged();
            showToast(activity, "刪除成功");
        }
        //解決刪除圖片後頂部圖片總數沒有變化的bug。
        tvCountView.setText((selectIndex + 1) + "/" + currentLabelList.size());
    }

獲取最新的圖片資料,然後進行刪除,上面的問題解決。