如何从图库中将图像添加到SQLite数据库并在ImageView中显示?

时间:2018-03-21 13:08:15

标签: android sqlite

在这里编程新手。

我正在创建一个应用程序,用于存储商店中所有商品的数据。

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

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

我在数据库中添加了一个像这样的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);

    }
}

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

我检查了其他使用get(" data")方法的答案,该方法导致Nullpoint异常。一些答案使用TEXT类型为图像创建列,而其他答案使用BLOB,因此它确实令人困惑。

我并不担心减慢应用程序速度或耗尽内存,所以请尽可能以最简单的方式帮助我。

1 个答案:

答案 0 :(得分:0)

  • 您应该在数据库表中使用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;
}

}

  

Adapter.class

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;
}

}

  

yourActivity

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,您可以显示该对象的信息和图像。