如何使用Android存储图像并从SQLite检索图像?

时间:2018-08-18 18:11:36

标签: android database sqlite

对于类似的问题,我尝试遵循其他答案并观看了视频,但没有任何结果对我有真正的帮助。我该如何编写代码来帮助我在SQLite中存储图像并进行检索?

这是我将其插入数据库(Database.java)的代码

public boolean insertFoodcourt(int id, String desc, String path){
        SQLiteDatabase db = this.getWritableDatabase();

        try {
            FileInputStream fs = new FileInputStream(path);
            byte[] imgbyte = new byte[fs.available()];
            fs.read(imgbyte);

            ContentValues contentvalues = new ContentValues();
            contentvalues.put("foodcourtid", id);
            contentvalues.put("foodcourtdesc", desc);
            contentvalues.put("foodcourtimg", imgbyte);

            db.insert("Foodcourt", null, contentvalues);
            fs.close();

            return true;

        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }

    }

这是我手动将数据插入数据库(MainPage.java)

db.insertFoodcourt(1, "Foodcourt 1", "@drawable/fc1");

这是我试图从数据库(Database.java)中检索图像的方法

public Bitmap getFoodcourtImg (int id){
    SQLiteDatabase db = this.getReadableDatabase();
    Bitmap fcImg = null;
    Cursor cursor = db.rawQuery("SELECT * FROM Foodcourt WHERE foodcourtid = ?", new String[]{String.valueOf(id)});
    if(cursor.moveToNext()){
        byte[] img = cursor.getBlob(cursor.getColumnIndex("foodcourtimg"));
        fcImg = BitmapFactory.decodeByteArray(img, 0, img.length);
    }
    return fcImg;
}

唯一的问题是检索图像并尝试将其放入CardView的ImageView中。在我编辑路径/“ foodcourtimg”之前,我使用了这段代码并能够获得描述,因此我知道该代码有效,这只是我遇到问题的图像部分。

public String getFoodcourtDesc (int id){
    SQLiteDatabase db = this.getReadableDatabase();
    String fcDesc = null;
    Cursor cursor = db.rawQuery("SELECT * FROM Foodcourt WHERE foodcourtid = ?", new String[]{String.valueOf(id)});
    if(cursor.moveToNext()){
        fcDesc = cursor.getString(cursor.getColumnIndex("foodcourtdesc"));
    }
    return fcDesc;
}

我们将不胜感激。 如果为TL; DR,则前三个代码需要帮助。将图像插入数据库的方法,插入图像(在这种情况下为路径)和拉出图像的方法。谢谢!

2 个答案:

答案 0 :(得分:2)

为什么要尝试将可绘制对象保存在已存储在应用程序中的数据库中?
您只需将其名称保存为字符串:"fc1",然后将其检索为字符串,例如在变量name中。
之后,通过:

int id = resources.getIdentifier(name, "drawable", context.getPackageName());

您获得其ID并获得可绘制对象:

Drawable d = getResources().getDrawable(id);

,您可以随意使用它。

答案 1 :(得分:0)

我有一个解决方案,而不是在db中保存byte [],尝试将图像存储在应用程序目录Check here的内部存储器中,然后将图像路径保存在表中。