I'm developing a small android notes app using java. Everything seems to be working fine except that I'm getting an error while trying to cast the instance SQLiteDatabase.execSql obj to a String. The purpose of doing this is that, it will allow user to update their data. In the custom adapter class (obBind method) I've set a tag, which means I've the id of each itemView even in my MainActivity. What I want it to do is when a user left swipes a particular item then his/her data should be set (editText.setText) in the edittext and if he/she clicks on the add button, the data should be updated.
Please refer to the codes for better understand-ability
CustomAdapter Class:
package com.example.myapplication20;
import android.content.Context;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
Context mContext;
Cursor mCursor;
CustomAdapter (Context context, Cursor cursor) {
mContext = context;
mCursor = cursor;
}
@NonNull
@Override
public CustomAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.single_item_layout, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(CustomAdapter.ViewHolder holder, int position) {
if (!mCursor.moveToPosition(position)) {
return;
}
String value = mCursor.getString(mCursor.getColumnIndex(TableDetailsClass.Collection.TABLE_COLUMN));
Long id = mCursor.getLong(mCursor.getColumnIndex(TableDetailsClass.Collection._ID));
holder.mTextView.setText(value);
holder.itemView.setTag(id);
}
@Override
public int getItemCount() {
return mCursor.getCount();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView mTextView;
TextView uTextView;
public ViewHolder(View itemView) {
super(itemView);
mTextView = itemView.findViewById(R.id.textView);
uTextView = itemView.findViewById(R.id.updateTextView);
}
}
public void swapCursor (Cursor newCursor) {
if (mCursor != null) {
mCursor.close();
}
mCursor = newCursor;
if (newCursor != null) {
notifyDataSetChanged();
}
}
}
MainActivity Class:
package com.example.myapplication20;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.CollapsibleActionView;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private EditText mEditText;
private Button addButton;
private RecyclerView mRecyclerView;
private SQLiteDatabase mDataBase;
MyOpenHelperClass myOpenHelperClass;
CustomAdapter mCustomAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myOpenHelperClass = new MyOpenHelperClass(this);
mDataBase = myOpenHelperClass.getWritableDatabase();
mEditText = findViewById(R.id.editText);
addButton = findViewById(R.id.button);
mCustomAdapter = new CustomAdapter(this, getAllItems());
mRecyclerView = findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(mCustomAdapter);
addButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addItems();
}
});
// Swipe delete
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
removeItem( (Long) viewHolder.itemView.getTag());
}
}).attachToRecyclerView(mRecyclerView);
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
updateItem( (Long) viewHolder.itemView.getTag());
}
}).attachToRecyclerView(mRecyclerView);
}
private void addItems () {
if (mEditText.getText().toString().trim().length() == 0) {
return;
}
String textToBeAdded = mEditText.getText().toString();
ContentValues cv = new ContentValues();
cv.put(TableDetailsClass.Collection.TABLE_COLUMN, textToBeAdded);
mDataBase.insert(TableDetailsClass.Collection.TABLE_NAME, null, cv);
mCustomAdapter.swapCursor(getAllItems());
mEditText.getText().clear();
}
public Cursor getAllItems () {
return mDataBase.query(TableDetailsClass.Collection.TABLE_NAME,
null,
null,
null,
null,
null,
TableDetailsClass.Collection.TIMESTAMP + " DESC"
);
}
public void removeItem (Long id) {
mDataBase.delete(TableDetailsClass.Collection.TABLE_NAME,
TableDetailsClass.Collection._ID + "=" + id, null);
mCustomAdapter.swapCursor(getAllItems());
Toast.makeText(this, "Item deleted!", Toast.LENGTH_SHORT).show();
}
public void updateItem (long id) {
String val = mDataBase.execSQL("SELECT * FROM " + TableDetailsClass.Collection.TABLE_NAME + " WHERE " +
TableDetailsClass.Collection._ID + "=" + id);
mEditText.setText(val); // The line I'm getting the error in. Says cannot cast void to string.
ContentValues cv = new ContentValues();
cv.put(TableDetailsClass.Collection.TABLE_COLUMN, mEditText.getText().toString());
mDataBase.update(TableDetailsClass.Collection.TABLE_NAME, cv,
TableDetailsClass.Collection._ID + "=" + id, null);
mCustomAdapter.swapCursor(getAllItems());
}
}
SQLiteOpenHelper Class:
package com.example.myapplication20;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class MyOpenHelperClass extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "myapp.db";
public static final int DATABASE_VERSION = 1;
public MyOpenHelperClass(@Nullable Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String SQL_CREATE_QUERY = "CREATE TABLE " +
TableDetailsClass.Collection.TABLE_NAME + "(" +
TableDetailsClass.Collection._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
TableDetailsClass.Collection.TABLE_COLUMN + " TEXT NOT NULL, " +
TableDetailsClass.Collection.TIMESTAMP + " TIMESTAMP DEFAULT CURRENT_TIMESTAMP" + ");";
db.execSQL(SQL_CREATE_QUERY);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TableDetailsClass.Collection.TABLE_NAME);
onCreate(db);
}
}
Any kind of help will be really appreciated.
public void updateItem (long id) {
Cursor cursor = mDataBase.rawQuery("SELECT * FROM " + TableDetailsClass.Collection.TABLE_NAME + " WHERE " +
TableDetailsClass.Collection._ID + "= ?", new String[]{String.valueOf(id)});
if (cursor != null && cursor.moveToFirst()) {
String val = cursor.getString(cursor.getColumnIndex(TableDetailsClass.Collection.TABLE_COLUMN));
mEditText.setText(val);
cursor.close();
}
...
}