Molly Kennedy
Molly Kennedy

Reputation: 1

How do I convert an image to a String to read/write it to a SQLite Database - Android Studio (Java)

I am having trouble converting an image to a String to read/write it to a SQLite Database on Android Studio using Java. I have watch loads of tutorials and cannot seem to find what I am missing. Any help at all would be appreciated!!

My error stems from not converting it from AddData in the Main Activity:

DATABASE HELPER:

    public class DatabaseHelper extends SQLiteOpenHelper {
    public static final String DATABASE_NAME = "relove.db";
    public static final String TABLE_NAME = "PLGarments_Table";
    public static final String COL_ID = "ID";
    public static final String COL_TITLE = "TITLE";
    public static final String COL_DESCRIPTION = "DESCRIPTION";
    public static final String COL_OWNER = "OWNER";
    public static final String COL_IMAGE = "image";



    public DatabaseHelper(@Nullable Context context) {
        super(context, DATABASE_NAME , null, 1);


    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table " + TABLE_NAME + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, TITLE TEXT, DESCRIPTION TEXT, OWNER TEXT, IMAGE BLOB)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(" Drop table if exists " + TABLE_NAME );
        onCreate(db);
    }

    public void queryData(String sql){
        SQLiteDatabase database = getWritableDatabase();
        database.execSQL(sql);
    } //unnecessary?



    public boolean insertData(String TITLE, String DESCRIPTION, String OWNER, byte[] image){             //CREATE
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        contentValues.put(COL_TITLE,TITLE);
        contentValues.put(COL_DESCRIPTION,DESCRIPTION);
        contentValues.put(COL_OWNER,OWNER);
        contentValues.put(COL_IMAGE, image);


        long result = db.insert(TABLE_NAME, null,contentValues );
            if (result == -1)
                return false;
            else
                return true;
    }

    public Cursor getAllData(){                                                          //RETRIEVE
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor res = db.rawQuery("select * from " + TABLE_NAME, null);
        return res;
    }


    public boolean updateData(String ID,String TITLE, String DESCRIPTION, String OWNER, byte[] image ){  //UPDATE
        SQLiteDatabase db = this.getWritableDatabase(); //instance of database
        ContentValues contentValues = new ContentValues();
        contentValues.put(COL_ID, ID);
        contentValues.put(COL_TITLE,TITLE);
        contentValues.put(COL_DESCRIPTION,DESCRIPTION);
        contentValues.put(COL_OWNER,OWNER);
        contentValues.put(COL_IMAGE, image);
        db.update(TABLE_NAME, contentValues, "ID = ?", new String[] {ID});
        return true;
    }

    public Integer deleteData (String ID){                                                  //DELETE
        SQLiteDatabase db = this.getWritableDatabase();
        return db.delete(TABLE_NAME, "ID = ?", new String[] {ID});
    }
}

Main Activity:


public class MainActivity extends AppCompatActivity {

    DatabaseHelper myDb;
    EditText editTitle, editDescription, editOwner, editTextID;
    Button btnAddData, btnviewAll, btnviewUpdate, btnDelete, btnLogOut;
    ImageView mImageView;

    final int REQUEST_CODE_GALLERY = 999;

    //use lines 37 - 40 when starting a new activity
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myDb = new DatabaseHelper(this); /*calling constructor*/

        editTitle = (EditText)findViewById(R.id.editText_title);
        editDescription = (EditText)findViewById(R.id.editText_description);
        editOwner = (EditText)findViewById(R.id.editText_owner);
        editTextID = (EditText)findViewById(R.id.editText_id);
        btnAddData = (Button)findViewById(R.id.button_add);
        btnviewAll = (Button)findViewById(R.id.button_viewAll);
        btnviewUpdate = (Button)findViewById(R.id.button_update);
        btnDelete = (Button)findViewById(R.id.button_delete);
        btnLogOut = (Button)findViewById(R.id.button_logout);
        mImageView = (ImageView)findViewById(R.id.imageView);
        AddData();
        viewAll();
        UpdateGarment();
        DeleteGarment();

       btnLogOut.setOnClickListener( new View.OnClickListener(){
           @Override
           public void onClick(View view){
               launchLoginActivity();
           }
       }
       ); // Learn2Crack - Android Switching Between Activities

    mImageView.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
               //read external storage permissions to select image from gallery
                    // Runtime permission for devices Android 6.0 and above
                    ActivityCompat.requestPermissions(
                            MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    REQUEST_CODE_GALLERY
                    );
              }
            });
    }

    //back to login
    public void launchLoginActivity(){
        Intent intent = new Intent (this, LoginActivity.class);
        startActivity(intent);
    } // Learn2Crack - Android Switching Between Activities

    //Create
    public void AddData(){
        btnAddData.setOnClickListener(
            new View.OnClickListener(){
                @Override
                public void onClick(View v){
                    boolean isInserted = myDb.insertData(editTitle.getText().toString(), editDescription.getText().toString(),
                            editOwner.getText().toString(), *mImageView.*);
                    if (isInserted == true)
                        Toast.makeText(MainActivity.this, "Garment Inserted", Toast.LENGTH_LONG).show();
                    else
                        Toast.makeText(MainActivity.this, "Garment Not Inserted", Toast.LENGTH_LONG).show(); }
            });
    } /*end of add button*/


    //Retrieve
    public void viewAll(){
        btnviewAll.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) { /*the actual action goes in here */
                        Cursor res = myDb.getAllData();
                        if (res.getCount() == 0){
                            //show message
                            showMessage("Error", "No Garments Found");
                            return;
                        }
                        StringBuffer buffer = new StringBuffer();
                        while ( res.moveToNext()){
                            buffer.append("ID :" + res.getString(0)+ "\n");
                            buffer.append("TITLE :" + res.getString(1)+ "\n");
                            buffer.append("DESCRIPTION :" + res.getString(2)+ "\n");
                            buffer.append("OWNER :" + res.getString(3)+ "\n\n");
                        }
                        //show all data
                        showMessage("Garments", buffer.toString());
                    }
                }
        );
    }

    //Update
    public void UpdateGarment(){
        btnviewUpdate.setOnClickListener(
                new View.OnClickListener(){
                    @Override
                    public void onClick(View v){
                        boolean isUpdate = myDb.updateData(editTextID.getText().toString(), editTitle.getText().toString(),
                                editDescription.getText().toString(), editOwner.getText().toString() );
                        if (isUpdate == true)
                            Toast.makeText(MainActivity.this, "Garment Updated", Toast.LENGTH_LONG).show();
                        else
                            Toast.makeText(MainActivity.this, "Garment Not Updated", Toast.LENGTH_LONG).show();
                    }
                }
        );
    }

    //Delete
    public void DeleteGarment(){
        btnDelete.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Integer deletedRows = myDb.deleteData(editTextID.getText().toString());
                        if (deletedRows > 0)
                            Toast.makeText(MainActivity.this, "Garment Deleted", Toast.LENGTH_LONG).show();
                        else
                            Toast.makeText(MainActivity.this, "Garment Not Deleted", Toast.LENGTH_LONG).show();
                    }
                }
        );
    }


    public void showMessage(String title, String message){
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setCancelable(true);
        builder.setTitle(title);
        builder.setMessage(message);
        builder.show();
    }

    //Gallary permission
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
       if (requestCode == REQUEST_CODE_GALLERY){
           if (grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
              //gallery intent
               Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);
               galleryIntent.setType("image/*");
               startActivityForResult(galleryIntent, REQUEST_CODE_GALLERY);
           }
           else {
               Toast.makeText(this, "Don't have permission to access file location", Toast.LENGTH_SHORT).show();
           }
           return;
       }
       super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
       if(requestCode == REQUEST_CODE_GALLERY && resultCode == RESULT_OK) {
           Uri imageUri = data.getData();
          CropImage.activity(imageUri)
                  .setGuidelines(CropImageView.Guidelines.ON)
                  .setAspectRatio(1,1)
                  .start(this);

       }
       if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE){
           CropImage.ActivityResult result = CropImage.getActivityResult(data);
           if (resultCode == RESULT_OK){
               Uri resultUri = result.getUri();
               //set image chosen from gallery to image view
               mImageView.setImageURI(resultUri);
           }
           else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE){
               Exception error = result.getError();
           }
       }
       super.onActivityResult(requestCode, resultCode, data);
    }


}

Upvotes: 0

Views: 117

Answers (1)

user12691429
user12691429

Reputation:

You need to convert mImageView. to a byte[] (bitmap).

So

BitmapDrawable d = (BitmapDrawable) mImageView.getDrawable();
Bitmap b = d.getBitmap();
boolean isInserted = myDb.insertData(editTitle.getText().toString(), editDescription.getText().toString(),
                    editOwner.getText().toString(), b);

If bitmap larger than 2Mb then cannot be got from Cursor. It is not advised to store bitmap in database but to store bitmap as file and to store path in database.

Upvotes: 1

Related Questions