当图像为空时,数据不会插入数据库

时间:2017-04-27 13:52:15

标签: java android mysql android-fragments imageview

我想将数据存储到数据库中,并希望上传可选的图像。

这意味着如果我在没有添加图像的情况下插入记录,那么它将存储在没有图像名称的数据库中。

现在当我填充数据并插入图像然后它存储在数据库中如果我没有选择任何图像我只添加数据然后在数据库中没有插入数据并在每个显示空白值字段

我尝试了很多但没有得到所需的输出。

我的代码 main.java

    buy_image1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                selectImage();
                edit.putInt("ImageID", 1);
                edit.commit();


            }
        });

        public void selectImage()
    {
        i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(i, RESULT_LOAD_IMAGE);
        /*i.putExtra("crop", "true");
        i.putExtra("outputX", 512);
        i.putExtra("outputY", 512);
        i.putExtra("aspectX", 1);
        i.putExtra("aspectY", 1);
        i.putExtra("scale", true);
    */
    }
    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RESULT_LOAD_IMAGE && resultCode == getActivity().RESULT_OK && null != data) {
            final int IMAGE_MAX_SIZE = 1200000; // 1.2MP

            Uri selectedImage = data.getData();
            int imgid = 0;
            String[] filePathColumn = {MediaStore.MediaColumns.DATA};

           Cursor cursor = getActivity().getContentResolver().query(selectedImage, filePathColumn, null, null, null);
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            picturePath = cursor.getString(columnIndex);
            cursor.close();
            Log.d("Value", picturePath);
            fileName = new File(picturePath).getName();
            // imgname.setText(fileName);

            String fileNameSegments[] = picturePath.split("/");
            fileName = fileNameSegments[fileNameSegments.length - 1];

            // MyParams.put("filename", fileName);
            Bitmap yourSelectedImage = BitmapFactory.decodeFile(picturePath);

            sp = getActivity().getSharedPreferences("Image ID", Context.MODE_PRIVATE);
            imgid = sp.getInt("ImageID", 0);
            Log.d("IMGID", Integer.toString(imgid));


            BitmapFactory.Options options =null;
            options = new BitmapFactory.Options();
            options.inSampleSize = 5;
            bitmap = BitmapFactory.decodeFile(picturePath, options);
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 85, stream);

            byte[] byte_arr = stream.toByteArray();
            // Encode Image to String
            encodedString = Base64.encodeToString(byte_arr, 0);


            if(imgid == 1) {
                buy_image1.setImageBitmap(yourSelectedImage);
                img1 = fileName;
                encodedStringIMG1 = encodedString;
            }else if(imgid == 2){

                buy_image2.setImageBitmap(yourSelectedImage);
                img2 = fileName;
                encodedStringIMG2 = encodedString;

            }
        else{
                Log.d("IMGID","IMAGE ID IS 0");
            }
    }
    private void InsertWodinformation() {

        service(strwodname,strbranch,strcontactperson,strcontact,strwhatsapp,stremail,
                strspinnercity,straddress,opendate1,birthdate,ani,strpancard,strtinnumber,strbankname,strbankholdername,strbankac,
                strbankcity, strifsccode,strsecuritycheque,strrefrence1,strrefrence2,strremarks,img1,encodedStringIMG1,img2,encodedStringIMG2);
    }
private void service(
        String strwodname,String strbranch,
        String strcontactperson, String strcontact,
        String strwhatsapp, String stremail, String strspinnercity,
        String straddress, String opendate1, String birthdate, String ani,
        String strpancard, String strtinnumber, String strbankname, String strbankholdername
        ,String strbankac,String strbankcity, String strifsccode,String strsecuritycheque,String strrefrence1,
        String strrefrence2,String strremarks,String i1,String encode1,String i2,String encode2
  ) {

        class AddVisitclass extends AsyncTask<String, Void, String> {
            ProgressDialog loading;
            RegisterUserClass ruc = new RegisterUserClass();

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }
            @Override
            protected String doInBackground(String... params) {


                HashMap<String, String> param = new HashMap<String, String>();


                /*param.put("firm", params[1]);
                param.put("oname", params[2]);
                param.put("pname1", params[3]);
                param.put("pname2", params[4]);
                */
                param.put("wname", params[0]);
                param.put("branch", params[1]);
                param.put("cname", params[2]);
                param.put("contact", params[3]);
                param.put("whatsapp", params[4]);
                param.put("email", params[5]);

                param.put("city", params[6]);
                param.put("address", params[7]);
                param.put("odate", params[8]);
                param.put("bdate", params[9]);
                param.put("adate", params[10]);
                param.put("pancard", params[11]);
                param.put("tinno", params[12]);
                param.put("bnm", params[13]);
                param.put("bank_ac_holder", params[14]);
                param.put("bank_ac_no", params[15]);
                param.put("bcity", params[16]);
                param.put("ifsc_code", params[17]);
                param.put("cheque", params[18]);
                param.put("ref1", params[19]);
                param.put("ref2", params[20]);
                param.put("remarks", params[21]);

                param.put("pan", params[22]);
                param.put("epan", params[23]);
                param.put("aadhar", params[24]);
                param.put("eaadhar", params[25]);
/*


                param.put("light", params[26]);
                param.put("elight", params[27]);

                param.put("vat", params[28]);
                param.put("evat", params[29]);

                param.put("vcard", params[30]);
                param.put("evcard", params[31]);

                param.put("shop", params[32]);
                param.put("eshop", params[33]);
*/



                param.put("username",uid);
                String result = ruc.sendPostRequest(url_addwod, param);
                Log.d("Result", result);
                Log.d("Data", param.toString());
                return result;
            }
            //@Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
                //loading.dismiss();


                Toast.makeText(getActivity(), "W.O.D. added successfully...!!!", Toast.LENGTH_LONG).show();
                /* FragmentTransaction t = getActivity().getSupportFragmentManager().beginTransaction();
                TabFragment mFrag = new TabFragment();
                t.replace(com.Weal.sachin.omcom.R.id.framelayout, mFrag);
                t.commit();
                */
            }
        }
        AddVisitclass regi = new AddVisitclass();
        regi.execute(strwodname,strbranch,strcontactperson,strcontact,strwhatsapp,stremail,
                strspinnercity,straddress,opendate1,birthdate,ani,strpancard,strtinnumber,strbankname,strbankholdername,strbankac,
                strbankcity, strifsccode,strsecuritycheque,strrefrence1,strrefrence2,strremarks,i1,encode1,i2,encode2);
    }

还有一件事,当图像上传到服务器时,它产生的尺寸较小,但我想要它的默认尺寸。

6 个答案:

答案 0 :(得分:5)

存储图像/文件数据的最佳方法是将图像保存到设备存储资源(例如内部存储器或外部存储资源),然后将图像URL / URI保存在数据库中(而不是在数据库中保存blob字段)数据库),要显示它,您所要做的就是检索文件URL并将其显示在设备上。

我希望这能为您提供更好的解决方案。

答案 1 :(得分:2)

保存图像的最佳方法是将它们保存在您正在使用的计算机或设备中,并通过SQL查询将图像的路径(位置)传递到数据库,当您想要访问图像时,获取图像的位置来自数据库和显示的图像。

以下链接将帮助您了解 http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

答案 2 :(得分:1)

  

你必须将位图转换为BLOB格式才能保存下面的数据库   代码:

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
    byte[] byteArray = byteArrayOutputStream.toByteArray();
    String encodedData = Base64.encodeToString(byteArray, Base64.DEFAULT);

    dba.insertPhoto(byteArray);

答案 3 :(得分:1)

首先考虑压缩图像,以减小图像的大小以进行存储。这里有三个选项,首先你可以获得图像的base64表示,然后是一个字符串然后存储它,或者获取字节数组输出并仍然存储它。最后存储手机上图像的uri参考。虽然我不推荐这种方法,因为它会受到路径更改和用户删除。

这是一个使用google webp的伟大库.WebP是一种现代图像格式,可为图像提供卓越的无损和有损压缩。与PNG相比,WebP无损图像的尺寸缩小了26%。在等效的SSIM质量指数下,WebP有损图像比同类JPEG图像小25-34%。 Link to library

以下是一系列可以执行您请求的代码段!

private static String CompressJPEG(Bitmap bitmap) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
        byte[] byteFormat = stream.toByteArray();
        return Base64.encodeToString(byteFormat, Base64.DEFAULT);
    }
 private static byte[] CompressJPEGByteArray(Bitmap bitmap) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
        return stream.toByteArray();
    }

 private static String CompressPNG(Bitmap bitmap) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
        byte[] byteFormat = stream.toByteArray();
        return Base64.encodeToString(byteFormat, Base64.DEFAULT);
    }
  private static byte[] CompressPNGByteArray(Bitmap bitmap) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
        return stream.toByteArray();
    }

   private static Bitmap RevertImageBase64(String encodedImage) {
        byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
        return BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
    }

public static Bitmap RevertFromByteArray(byte[] arr) {
        return BitmapFactory.decodeByteArray(arr, 0, arr.length);
    }

这里也是从uri获取扩展名的代码。

 public static void GetExtensionFromContentURI(Context context, Uri uri) {
        ContentResolver cR = context.getContentResolver();
        MimeTypeMap mime = MimeTypeMap.getSingleton();
        String ext = mime.getExtensionFromMimeType(cR.getType(uri));

    }

希望这会有所帮助:)

答案 4 :(得分:1)

关于您提到的大小问题,在onActivityResult()中,声明:

options.inSampleSize = 5;

可能是文件小于原始图像的原因。

这是ImageView所必需的。在压缩之前,请保持非压缩的Coopy以便传输到服务器。

要弄乱您需要发布的图片插页:

  1. 如果数据库中的列定义为“not null”
  2. 当没有选择图片时,它发送到服务器的值的Log.d()。
  3. 服务器上接收数据并执行插入的代码。

答案 5 :(得分:1)

缓存图片的最简单方法。是使用JakeWharton / picasso2-okhttp3-downloader 这是一个例子:

       OkHttpClient okHttpClient = new OkHttpClient();
    okHttpClient.networkInterceptors().add(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Response originalResponse = chain.proceed(chain.request());
            return originalResponse.newBuilder().header("Cache-Control", "max-age=" + (60 * 60 * 24 * 365)).build();
        }
    });
    try{


        okHttpClient.setCache(new Cache(this.getCacheDir(), Integer.MAX_VALUE));
        OkHttpDownloader okHttpDownloader = new OkHttpDownloader(okHttpClient);
        Picasso picasso = new Picasso.Builder(this).downloader(okHttpDownloader).build();
        picasso.load("pucul").error(R.drawable.teacher).into(imgvw);
    }
    catch (Exception e){

将此添加到您的gradle文件

compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'

Source :