Android,什么是将图像存储到SQLite数据库的最佳方法,以及从db中检索图像?

时间:2017-09-21 17:38:51

标签: android sqlite

我在android中有新功能,我有一个应用程序,使用Uri显示图库中的图像,使用位图显示图像,但有时候图像加载缓慢,如果我滚动应用程序挂虽然我使用标准转换Uri按位图As关注:

public static Bitmap getBitmapFromUri(Uri uri ,Context context,ImageView imageView) {

        if (uri == null || uri.toString().isEmpty())
            return null;

        // Get the dimensions of the View
        int targetW = imageView.getWidth();
        int targetH = imageView.getHeight();

        InputStream input = null;
        try {
            input = context.getContentResolver().openInputStream(uri);

            // Get the dimensions of the bitmap
            BitmapFactory.Options bmOptions = new BitmapFactory.Options();
            bmOptions.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(input, null, bmOptions);
            input.close();

            int photoW = bmOptions.outWidth;
            int photoH = bmOptions.outHeight;

            // Determine how much to scale down the image
            int scaleFactor = Math.min(photoW / targetW, photoH / targetH);

            // Decode the image file into a Bitmap sized to fill the View
            bmOptions.inJustDecodeBounds = false;
            bmOptions.inSampleSize = scaleFactor;
            bmOptions.inPurgeable = true;

            input = context.getContentResolver().openInputStream(uri);
            Bitmap bitmap = BitmapFactory.decodeStream(input, null, bmOptions);
            input.close();
            return bitmap;

        } catch (FileNotFoundException fne) {
            Log.e(LOG_TAG, "Failed to load image.", fne);
            return null;
        } catch (Exception e) {
            Log.e(LOG_TAG, "Failed to load image.", e);
            return null;
        } finally {
            try {
                input.close();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
    }

按照

调用此方法
  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        // Receive the request code if match the product request id start get the image Uri
        if (PICK_PRODUCT_IMAGE == requestCode) {
            if (data != null) {
                imageUri = data.getData();

                getContentResolver().takePersistableUriPermission(imageUri,
                        Intent.FLAG_GRANT_READ_URI_PERMISSION);
                /**
                 * Start Set The Image Bitmap By Uri Of the Image
                 * Using {@link UploadImageBitmap#convertImageUriByBitmap(Uri, Context)}  }
                 */
                  //      productImageView.setImageBitmap(UploadImageBitmap.getBitmapFromUri(imageUri, getApplicationContext(),productImageView));

              productImageView.setImageBitmap(UploadImageBitmap.convertImageUriByBitmap(imageUri, this));

            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

存储Uri和显示图像使用它比存储图像在数据库中并直接显示,或者我使用错误的方式显示图库或文件夹中的图像?是否有更好的方式以更好的性能显示图库和数据库中的图像?

1 个答案:

答案 0 :(得分:1)

这取决于您的应用对安全性的需求以及图像应该是本地还是远程。

您可以上传到S3,然后将该网址存储在您的数据库中 您可以存储在mediaStore aka gallery中并调用相应的意图来刷新库,因为它不会是默认重新扫描,因此您必须强制重新扫描该文件名以将其添加到库中,如:

 MediaScannerConnection.scanFile(this, new String[] { Environment.getExternalStorageDirectory().toString() }, null, new MediaScannerConnection.OnScanCompletedListener() {
        /*
         *   (non-Javadoc)
         * @see android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(java.lang.String, android.net.Uri)
         */
        public void onScanCompleted(String path, Uri uri) 
          {
              Log.i("ExternalStorage", "Scanned " + path + ":");
              Log.i("ExternalStorage", "-> uri=" + uri);
          }
        });

或者您可以将图像保存到您自己的私有应用程序目录中,并将URI存储在您的数据库中。

在公共图库中存储的问题是用户可以删除它。如果他们删除它并且您的应用加载了来自本地SQLite的URI并且它们丢失了,那么也必须处理它们。除非您只存储在私人目录中。

我首选的方法是“如果它仅用于我的应用程序”然后存储在应用程序的私人目录中,并将URI与模型连续存储在数据库中。如果它需要在其他设备上工作,那么我上传到S3。如果需要从图库访问它,那么我添加到库和重新扫描。但无论你走哪个方向,你仍然只是将URI或URL存储到图像中。

希望有所帮助。