【问题标题】:How to add an image to a SQLite database from your gallery and display it in ImageView?如何从您的图库中将图像添加到 SQLite 数据库并在 ImageView 中显示?
【发布时间】:2018-03-21 13:08:14
【问题描述】:

这里是编程新手。

我正在制作一个应用程序来存储商店中所有商品的数据。

该应用有一个活动,可以在列表视图中显示商品名称和库存数量。 (完成)

单击列表视图项会将您带到另一个活动,该活动显示该特定项目的详细信息,其中包括一张图片(我不知道该怎么做)。

我在数据库中添加了一个这样的 BLOB 类型的列。

 @Override
    public void onCreate(SQLiteDatabase db) {
    String SQL_CREATE_ITEMS_TABLE =  "CREATE TABLE "  
    + ItemEntry.TABLE_NAME + " ("
    + ItemEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
    + ItemEntry.COLUMN_ITEM_IMAGE + "BLOB, "
    + ItemEntry.COLUMN_ITEM_NAME + " TEXT NOT NULL, "
    + ItemEntry.COLUMN_ITEM_QUANTITY 
    + " INTEGER NOT NULL DEFAULT 0, "
    + ItemEntry.COLUMN_ITEM_COST_PRICE 
    + " INTEGER NOT NULL, "
    + ItemEntry.COLUMN_ITEM_SELLING_PRICE + " INTEGER NOT NULL);";  
    db.execSQL(SQL_CREATE_ITEMS_TABLE);
    } 

我在详细信息活动中放置了一个“添加图片”按钮,点击后,它应该将用户带到画廊并允许选择一张照片并将照片添加到数据库中并在图像视图中显示照片相同的活动。

这是我在 addImage 按钮上的 onClickListener 代码。

addImageButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent in = new Intent(
                    Intent.ACTION_PICK,                    
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            in.setType("image/*");
            in.putExtra("crop", "true");
            in.putExtra("outputX", 100);
            in.putExtra("outputY", 100);
            in.putExtra("scale", true);
            in.putExtra("return-data", true);

            startActivityForResult(in, 1);
        }
    });

这里是onActivityResult方法的代码。

@Override
protected void onActivityResult(int requestCode, int resultCode, 
Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 1 && resultCode == RESULT_OK && data != null) {

        Uri imageUri = data.getData();
        mImage.setImageURI(imageUri);

    }
}

在上面的代码中,我不知道如何将每个项目的照片存储在数据库中。

我检查了其他使用导致 Nullpoint 异常的 get("data") 方法的答案。有些答案使用 TEXT 类型来创建图像列,而另一些则使用 BLOB,所以真的很混乱。

我不担心应用程序变慢或内存不足,所以请帮助我以最简单的方式完成此操作。

【问题讨论】:

  • 您需要将其转换为base64广告存储该字符串在数据库中,并在设置imagview时调用该字段
  • 您可以将图片的 URI 保存在您的表格中。
  • 我同意@SripadRaj,你应该恢复图片的URI,当你在imageview中设置图片时,你可以使用image fromuri来获取图片。
  • 谢谢,我使用全局字符串变量来存储图像 URI,但在我的 onActivityResult() 方法中,我无法更新变量以保存 URI。

标签: android sqlite


【解决方案1】:
  • 您应该在数据库表中使用图像的 Uri 而不是 blob。
  • 首先,您可以将您从图库或相机中获取的图片转换为 uri。
  • 保存到数据库。
  • 从数据库中检索时,您还将数据作为 uri 导入并将其分配给 imageView。

检查以下示例代码块。

转换

cv.put("questPhoto",uri.toString());

检索

strPhoto=cursor.getString(cursor.getColumnIndexOrThrow("questPhoto"));
                uriph= Uri.parse(strPhoto);
                questions.setImgsoru(uriph);

在您的列表对象中定义类和适配器。像这样,

Item.class

public class Item {

String arkadi;
Uri arkresmi;
Integer arkId;

public Item(){

}

public String getArkadi() {
    return arkadi;
}

public void setArkadi(String arkadi) {
    this.arkadi = arkadi;
}

public Uri getArkresmi() {
    return arkresmi;
}

public void setArkresmi(Uri arkresmi) {
    this.arkresmi = arkresmi;
}

public Integer getArkId() {
    return arkId;
}

public void setArkId(Integer arkId) {
    this.arkId = arkId;
}

}

适配器类

public class Adapter extends ArrayAdapter<Item> {


Context context;
ArrayList<Item> listarray=new ArrayList<>();
private int resource;

public Adapter(Context context, int resource, ArrayList<Item> listarray) {
    super(context, resource, listarray);
    this.context=context;
    this.resource=resource;
    this.listarray=listarray;
}
class ViewTutucuArks{
    CircleImageView crcImgpp;
    TextView txtarkisim;

    ViewTutucuArks(View v){
        crcImgpp= (CircleImageView) v.findViewById(R.id.crcimgarkresim);
        txtarkisim= (TextView) v.findViewById(R.id.txtarkismi);
    }
}

@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View view8=convertView;
    ViewTutucuArks viewTutucuArks;

    if(view8==null){
        LayoutInflater layoutInflater= (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view8=layoutInflater.inflate(R.layout.custom_list,parent,false);
        viewTutucuArks=new ViewTutucuArks(view8);
        view8.setTag(viewTutucuArks);
    }
    else{
        viewTutucuArks= (ViewTutucuArks) view8.getTag();
    }
    Item itemark=listarray.get(position);
    viewTutucuArks.crcImgpp.setImageURI(itemark.getArkresmi());
    viewTutucuArks.txtarkisim.setText(itemark.getArkadi());

    return view8;
}

}

你的活动

private void getAndShowQuestionsOfTEOGTR() {
    Cursor cursor=mSQLiteDb.rawQuery("...",null);

    if (cursor!=null){
        if(cursor.moveToFirst()){
            do {
                ItemQuestions questions=new ItemQuestions();

       questions.setStrsoruid(cursor.getString(cursor.getColumnIndexOrThrow("_id")));
                                strqp=cursor.getString(cursor.getColumnIndexOrThrow("questPhoto"));
                uriqp= Uri.parse(strqp);
                questions.setImgsoru(uriqp);
                //there is more

                questArray.add(questions);

            }while (cursor.moveToNext());
        }cursor.close();
    }mSQLiteDb.close();
    yourAdapter=new yourAdapter(getApplicationContext(),R.layout.yourCustomList,questArray);
    yourList.setAdapter(adapterQuestions);
}

最后,使用 ListClickHandler,您可以显示该对象的信息和图像。

【讨论】:

  • 您好,谢谢,实际上我使用的是CursorAdapter,我在使用onActivityResult 方法时遇到问题,只有在活动结束时才调用此方法?这意味着我将无法在运行时获取图像 URI 并将其存储在数据库中?
  • 在OnActivityResult的最后,可以用自己准备好的方法将图片(uri)保存到数据库中。
  • 谢谢,我能够将图像的 URI 存储在数据库中,但是当从数据库加载图像时,我得到了 SecurityException。
  • 你知道onActivityResult方法里面怎么获取图片的byteArray吗?
猜你喜欢
  • 2021-09-29
  • 2012-06-05
  • 2020-03-25
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 2021-12-19
  • 1970-01-01
相关资源
最近更新 更多