【问题标题】:Data is not inserting to database when image is null当图像为空时,数据未插入数据库
【发布时间】:2017-09-25 08:56:26
【问题描述】:

我想把数据存入数据库,想上传一张可选的图片。

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

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

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

我的代码ma​​in.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);
    }

还有一件事,当图像上传到服务器时,它会生成较小的尺寸,但我希望它采用默认尺寸。

【问题讨论】:

  • 请为您尝试存储的表提供SHOW CREATE TABLE
  • 你要api???
  • 使用mysql命令行工具,我们可以深入了解数据库的细节。
  • 我使用的是 5.5 而不是 5.7,这段代码是正确的还是我需要在这里更改一些代码??
  • 我不知道问题出在 API 还是代码中..

标签: java android mysql android-fragments imageview


【解决方案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);

【讨论】:

  • 是的,这个选项很好,我想说的是 base64,但空间复杂度要大得多
  • 现在图像存储在服务器中,但我面临的问题是图像尺寸越来越小,但我希望图像尺寸保持原样。
  • 看看我已经编辑并放入了我在我的应用程序中使用过的代码,完美地保存了照片
  • 你能看看我更新的问题吗?我只是更新它并为它设置赏金
  • 是的,我给出的答案在我的应用程序中使用,我没有遇到任何问题,所以我认为它是正确的
【解决方案2】:

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

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

【讨论】:

  • 不幸的是,我在 Android 开发方面没有经验,所以请原谅我在没有解决您在代码中面临的问题的情况下添加此解决方案,但我看到了您关于将文件保存到数据库的问题,问题与你最终会得到一个巨大的数据库来保存少量文件,并将文件保存在服务器中,是的,当然,因为我记得我为之工作的公司有一个媒体服务器来存储媒体文件,他们使用它IOS 和 Android 也可以为他们正在使用的平台节省一些问题。
  • 这种方法虽然可行但并不完全推荐,当源发生变化时会发生什么?
  • 你能看看我更新的问题吗?我只是更新它并为它设置赏金
  • 您在上传/保存过程中遇到的错误是什么?它可能与数据库列有关,您可以创建它并将其设置为不允许空值,如果您对上传过程进行了硬编码,该过程需要 6 张图像,不少于不少。如果您有任何错误显示,请提供。
【解决方案3】:

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

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

这里有大量可以执行您的请求的代码 sn-ps!

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】:

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

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

【讨论】:

  • 我面临的问题是,当我上传一张图像时,记录并没有存储到数据库中,但是当我插入所有图像时,记录正在插入到数据库中
【解决方案5】:

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

options.inSampleSize = 5;

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

这是 ImageView 所需要的。压缩前,请保留一个未压缩的coopy,以便传输到服务器。

要解决您需要发布的图片的插入问题:

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

【讨论】:

    【解决方案6】:

    像下面这样重构代码可能会对您有所帮助。不要以方法名、变量名等部分为例。我想给你一个样本设计的鸟瞰图。

    //controller of user request.
    handleRequest(){
        String imagePath=null;
        if(imageExists){ //if user sent image to server.
            imagePath=saveImageAndReturnImagePath(...);
        }
    
        saveRecordToDB(request.getText(), imagePath);
    }
    
    
     //save image to disk and return image path.
    private String saveImageAndReturnImagePath(...){
        //do image manipulation here, save image to disk, return path.
        return imagePath;
    }
    
    //insert a new record to db.
    private void saveRecordToDB(String text, imagePath){
        Record a=new Record(text, imagePath);
        dao.save(a);
    }
    

    【讨论】:

      【解决方案7】:

      缓存图像的最简单方法。是使用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 :

      【讨论】:

        猜你喜欢
        • 2021-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-10
        • 2018-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多