Как мне отправить изображение галереи виджету listview, который находится в другом действии в Android Studio

#android #sql #sqlite #android-studio #android-sqlite

#Android #sql #sqlite #android-studio #android-sqlite

Вопрос:

Итак, чтобы просто описать приложение, которое я создаю, на главном экране есть 3 кнопки: «Ввод данных», «Отображение информации» и «Выход». Когда пользователь нажимает «Ввод данных», он может заполнить некоторые поля EditText информацией, а также ЗАГРУЗИТЬ ИЗОБРАЖЕНИЕ из галереи. Как только они нажмут кнопку «Сохранить» на странице, все введенные данные будут отправлены в виджет ListView на экране «Отображение информации». Однако сейчас моя проблема заключается в том, что мне удалось получить значения EditText в представлении списка с помощью Sqlite, но в настоящее время я понятия не имею, как получить изображение, которое было загружено из галереи в виджет ListView

Это рабочие коды, которые у меня есть (отсутствует только часть изображения)

TouristHelper

 import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class TouristHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "assignment.db";
private static final int SCHEMA_VERSION = 1;

public TouristHelper(Context context){
    super(context, DATABASE_NAME, null, SCHEMA_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db){
    //will be called once when the database 1s not created
    db.execSQL("CREATE TABLE tourist_table ( _id INTEGER PRIMARY KEY AUTOINCREMENT,"  
            " Vactivity TEXT, Vdate TEXT, Vdescription TEXT);");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
    //Will not be called until SCHEMA_VERSION increases
    // Here we can upgrade the database e.g. add more tables
}

/*Read all records from restaurants_Table */
public Cursor getAll() {
    return (getReadableDatabase().rawQuery(
            "SELECT _id, Vactivity, Vdate, Vdescription "  
                    "FROM tourist_table ORDER BY Vactivity", null));
}

public Cursor getById(String id) {
    String[] args = {id};
    return (getReadableDatabase().rawQuery(
            "SELECT _id, Vactivity, Vdate, Vdescription"  
                    " FROM tourist_table WHERE _ID = ?", args));

}

public void insert  (String Vactivity, String Vdate,
                     String Vdescription) {
    ContentValues cv = new ContentValues();

    cv.put("Vactivity", Vactivity);
    cv.put("Vdate", Vdate);
    cv.put("Vdescription", Vdescription);

    getWritableDatabase().insert("tourist_table", "Vactivity", cv);
}

public void update(String id, String Vactivity, String Vdate,
                   String Vdescription) {
    ContentValues cv = new ContentValues();
    String[] args = {id};
    cv.put("Vactivity", Vactivity);
    cv.put("Vdate", Vdate);
    cv.put("Vdescription", Vdescription);

    getWritableDatabase().update("tourist_table", cv, "_ID = ?", args);
}
public String getID(Cursor c) { return (c.getString(0)); }

public String getActivity(Cursor c){
    return (c.getString(1));
}
public String getDate(Cursor c){
    return (c.getString(2));
}
public String getDescription(Cursor c){
    return (c.getString(3));
}
}
 

InfoDisplay

 public class InfoDisplay extends AppCompatActivity {
private Cursor model = null;
private VietnamAdapter adapter = null;
private ListView list;
private TouristHelper helper = null;
private TextView empty = null;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.info_display);
    empty = findViewById(R.id.empty);
    helper = new TouristHelper(this);
    list = findViewById(R.id.listview);
    model = helper.getAll();
    adapter = new VietnamAdapter(this, model, 0);
    list.setOnItemClickListener(onListClick);
    list.setAdapter(adapter);
}

@Override
protected void onResume() {
    super.onResume();
    if (model != null) {
        model.close();
    }
    model = helper.getAll();
    if (model.getCount() > 0) {
        empty.setVisibility(View.INVISIBLE);
    }
    adapter.swapCursor(model);
}

@Override
protected void onDestroy() {
    helper.close();
    super.onDestroy();
}


private AdapterView.OnItemClickListener onListClick = new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            model.moveToPosition(position);
            String recordID = helper.getID(model);
            Intent intent;
            intent = new Intent(InfoDisplay.this, DataIn.class);
            intent.putExtra("ID", recordID);
            startActivity(intent);
        }
};

static class DataHolder {
    private TextView VietACTI = null;
    private TextView VietDATE = null;
    private TextView VietDES = null;

    DataHolder(View row) {
        VietACTI = row.findViewById(R.id.VAct);
        VietDATE = row.findViewById(R.id.VDate);
        VietDES = row.findViewById(R.id.VDes);
    }
    void populateFrom(Cursor c, TouristHelper helper) {
        VietACTI.setText(helper.getActivity(c));
        VietDATE.setText(helper.getDate(c));
        VietDES.setText(helper.getDescription(c));
    }
}

class VietnamAdapter extends CursorAdapter {
    VietnamAdapter(Context context, Cursor cursor, int flags) {
        super(context, cursor, flags);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        DataHolder holder = (DataHolder) view.getTag();
        holder.populateFrom(cursor, helper);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = getLayoutInflater();
        View row = inflater.inflate(R.layout.row, parent, false);
        DataHolder holder = new DataHolder(row);
        row.setTag(holder);
        return (row);
    }
}
}
 

Данные

 public class DataIn extends AppCompatActivity {

private EditText Vactivity;
private EditText Vdate;
private EditText Vdescription;
private Button buttonSave;

private Button buttonImg;
ImageView imageView;
private Bitmap imageToStore;
private static int RESULT_LOAD_IMAGE = 1;

private TouristHelper helper = null;
private String touristID = "";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_data_input);
    Vactivity = findViewById(R.id.activity);
    Vdate = findViewById(R.id.date);
    Vdescription = findViewById(R.id.description);
    buttonSave = findViewById(R.id.button_save);
    buttonSave.setOnClickListener(onSave);
    buttonImg = findViewById(R.id.imginput);
    buttonImg.setOnClickListener(onImg);

    imageView = findViewById(R.id.imgView);

    helper = new TouristHelper(this);

    touristID = getIntent().getStringExtra("ID");
    if (touristID != null) {
        load();
    }


    /*list = findViewById(R.id.Data);
    adapter = new DataAdapter();
    list.setAdapter(adapter);*/
}

@Override
protected void onDestroy() {
    super.onDestroy();
    helper.close();
}

private void load() {
    Cursor c = helper.getById(touristID);
    c.moveToFirst();
    Vactivity.setText(helper.getActivity(c));
    Vdate.setText(helper.getDate(c));
    Vdescription.setText(helper.getDescription(c));
}
View.OnClickListener onImg = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(
        /*Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(i, RESULT_LOAD_IMAGE*/);
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "pick an image"), RESULT_LOAD_IMAGE);
    }
};
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RESULT_LOAD_IMAGE amp;amp; resultCode == RESULT_OK amp;amp; data != null) {
        Uri selectedImage = data.getData();
        /*String[] filePathColumn = {MediaStore.Images.Media.DATA};
        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);
        cursor.moveToFirst();
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();*/
        // String picturePath contains the path of selected Image
        imageView.setImageURI(selectedImage);
        BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable();
        Bitmap bitmap = drawable.getBitmap();
    }
}


private View.OnClickListener onSave = new View.OnClickListener(){
    @Override
    public void onClick(View v){
        //read data from restaurantName EditText
        String nameStr = Vactivity.getText().toString();
        String dateStr = Vdate.getText().toString();
        String desStr = Vdescription.getText().toString();

        if (touristID == null) {
            helper.insert(nameStr, dateStr, desStr);
        }
        else {
            helper.update(touristID, nameStr, dateStr, desStr);
        }

        // To clase current Activity class and exit
        finish();
    }
};
}
 

Ответ №1:

На данный момент у вас есть два варианта:

  • Сохраните изображение в личном хранилище вашего приложения и сохраните в БД URI для этого изображения, чтобы вы могли загрузить его позже.
  • Имея растровое изображение с изображением, получите ByteArray изображения и сохраните его непосредственно в БД.

Я предпочитаю первый вариант, но второй тоже может справиться с этой задачей, надеюсь, это поможет вам.

Комментарии:

1. привет, спасибо за ответ!!! на самом деле я пытаюсь обойти второй вариант, но я не уверен, как отредактировать свой код, поскольку я все еще новичок в этом.