如何解码保存到 SQLite 数据库并在 ImageView 中显示的图像文件路径

Posted

技术标签:

【中文标题】如何解码保存到 SQLite 数据库并在 ImageView 中显示的图像文件路径【英文标题】:How to decode an image file path saved to SQLite database and display in ImageView 【发布时间】:2021-12-19 07:15:43 【问题描述】:

这就是我目前正在努力解决的问题。我正在使用以下代码将相机拍摄的图像保存到我的 SQLite 数据库中:

数据库数据库:

@Override
public void onCreate(SQLiteDatabase db) 
    String sql =     "create table " + DATABASE_TABLE + " ( " +
            FIELD_ROW_ID + " integer primary key autoincrement , " +
            FIELD_LNG + " double , " +
            FIELD_LAT + " double , " +
            FIELD_ZOOM + " text , " +
            FIELD_IMG + " text " +
            " ) ";

    db.execSQL(sql);

然后在相机意图中(Main Activity)

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            StrictMode.setVmPolicy(builder.build());
            Intent getCameraImage = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            File cameraFolder;
            if   (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
                cameraFolder = new    File(android.os.Environment.getExternalStorageDirectory(),"MapImages/");
            else
                cameraFolder= context.getFilesDir();
            if(!cameraFolder.exists())
                cameraFolder.mkdirs();
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            String imageFileName = "JPEG_" + timeStamp + "_";
            File photo = new File(cameraFolder, "MapImages/" + imageFileName + ".jpg");
            getCameraImage.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
            Uri.fromFile(photo);
            startActivityForResult(getCameraImage, TAKE_PICTURE);

            drawMarker(point);
            ContentValues contentValues = new ContentValues();
            contentValues.put(LocationsDB.FIELD_LAT, point.latitude);
            contentValues.put(LocationsDB.FIELD_LNG, point.longitude);
            contentValues.put(LocationsDB.FIELD_ZOOM, mMap.getCameraPosition().zoom);
            contentValues.put(FIELD_IMG, String.valueOf(photo));
            LocationInsertTask insertTask = new LocationInsertTask();
            insertTask.execute(contentValues);

所以当我查看数据库时,它会将图像文件位置保存为:

/storage/emulated/0/MapImages/MapImages/JPEG_20211105_091000_.jpg

所以一切都很好!但是我现在如何检索该图像并将其显示在 ImageView 中?

我已经尝试过了(在 onloadFinished 中)

public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) 
    int locationCount = 0;
    double lat = 0;
    double lng = 0;
    float zoom = 0;
    double img = 0;

    locationCount = arg1.getCount();
    arg1.moveToFirst();

    for (int i = 0; i < locationCount; i++) 
        lat = arg1.getDouble(arg1.getColumnIndex(LocationsDB.FIELD_LAT));
        lng = arg1.getDouble(arg1.getColumnIndex(LocationsDB.FIELD_LNG));
        zoom = arg1.getFloat(arg1.getColumnIndex(LocationsDB.FIELD_ZOOM));
        img = arg1.getDouble(arg1.getColumnIndex(LocationsDB.FIELD_IMG));
        LatLng location = new LatLng(lat, lng);
        drawMarker(location);
        arg1.moveToNext();
    

    if (locationCount > 0) 
        mMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(lat, lng)));
        mMap.animateCamera(CameraUpdateFactory.zoomTo(zoom));
        Bitmap myBitmap = BitmapFactory.decodeFile(String.valueOf(img));
        ImageView myImage = (ImageView) findViewById(R.id.imageView);
        myImage.setImageBitmap(myBitmap);
        
    

但随后收到以下错误:

E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: 0.0: open failed: ENOENT (No such file or directory)

我不想将图像保存为blob,因为这是不好的做法,因此我将文件路径保存到数据库

如果有人可以帮助指导我从数据库中检索文件并显示在我的ImageView

谢谢大家!

【问题讨论】:

I am saving the image taken by the camera to my SQLite database by using this code: 抱歉,我看到你什么也没保存。并且表 FIELD_IMG 不能保存图像文件,只能保存文本。所以可能只有一个文件路径。如果是这样,那么给该字段一个更好的、不易混淆的名称。请详细说明并编辑您的帖子以解决此困惑。 嗨,它以以下格式将图像文件路径保存到该 FIELD_IMG /storage/emulated/0/MapImages/MapImages/JPEG_20211105_091000_.jpg Si 我可以看到正在保存的文件。我只是无法检索要在ImageView 中显示的文件。 FIELD_IMG 是 text 而不是 blob Please edit your post to solve this confusion 我们等着你。 很抱歉让您感到困惑,但问题很清楚。 1. 将相机拍摄的图像保存到 SQLite 数据库 2. 图像文件路径(不是 blob)以这种格式保存到表中/storage/emulated/0/MapImages/MapImages/JPEG_20211105_091000_.jpg 3. 无法从表中检索图像文件以显示在ImageView 【参考方案1】:

替换:

img = arg1.getDouble(arg1.getColumnIndex(LocationsDB.FIELD_IMG));

与:

img = arg1.getString(arg1.getColumnIndex(LocationsDB.FIELD_IMG));

这还需要您将img 声明为String

文件系统路径是字符串,而不是浮点数。

【讨论】:

嗨@Commonsware,感谢您的帮助。我现在面临的问题是:Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/Images/MyImage_20211105_130843.jpg: open failed: ENOENT (No such file or directory) 权限是正确的,但是当我尝试在手机上浏览到该位置(或查看图库应用程序)时,我没有看到文件(照片)?跨度> @Keith: Uri.forFile() 在 Android 7.0 及更高版本上默认不起作用。使用FileProvidergetUriForFile() 所以基本上我需要重写我的整个代码? :-) 没关系,我想出了上面提到的使用方法。但我现在收到此错误。 Attempt to invoke virtual method 'java.lang.String java.io.File.getCanonicalPath()' on a null object reference

以上是关于如何解码保存到 SQLite 数据库并在 ImageView 中显示的图像文件路径的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sqlite 或 CoreData 中保存位置坐标,并在 swift 中进行重要的位置监控

Android:如何用相机拍照并将位图转换为字节数组并保存到sqlite db?

如何从 SQLite 数据库中获取数据并在 EditText 中显示

如何将位图从 ImageView 保存到数据库 sqlite?

如何通过 FMDB 将数据保存和检索到 sqlite

如何使用 SQLite 和 PHP 将图像保存到数据库?