SQLiteDatabase update not working?
Would you print the db.update(TABLE_NAME, values, C_ID +"="+id, null) function return value?
If the return value is 0, so there is no such "id" row record in DB.
Wayne B Jackson
I am an aspiring Computer Science Engineering student at the University of Toledo looking to better my skills as a programmer.
Updated on June 16, 2022Comments
-
Wayne B Jackson almost 2 years
I am trying to get db.update to update one of the rows of my database with new values but it does not seem to be saving. I have looked over my syntax but I cannot seem to get the data to save. The insert function is working but not update. Any help would be appreciated. Below is my data class which uses a DbHelper object.
public class Data { static final String TAG = "Data"; public static final String DB_NAME = "data.db"; public static final String TABLE_NAME = "tasks"; public static final String C_ID = "_id"; public static final String C_TASK = "taskname"; public static final String C_DUE_DATE = "due_date"; public static final String C_PRIORITY = "priority"; public static final int DB_VERSION = 1; Context context; DbHelper dbHelper; SQLiteDatabase db; public Data(Context context) { this.context = context; dbHelper = new DbHelper(); } public void insert(ToDoItem task) { db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(C_TASK, task.getTask()); values.put(C_PRIORITY, task.getPriority()); db.insert(TABLE_NAME, null, values); } public void update(int id, ToDoItem task) { ContentValues values = new ContentValues(); values.put(C_ID, id); values.put(C_TASK, task.getTask()); values.put(C_PRIORITY, task.getPriority()); String[] whereArgs = {String.valueOf(id)}; db.update(TABLE_NAME, values, C_ID +" =?", whereArgs); System.out.println(db.update(TABLE_NAME, values, C_ID +" =?", whereArgs)); Log.d(TAG, "updating task " + db.toString() +" "+ id + " to priority " + task.getPriority()); } public void delete(int id){ db.delete(TABLE_NAME, C_ID+"="+id, null); } public Cursor queueAll(){ db = dbHelper.getWritableDatabase(); String[] columns = new String[]{C_ID, C_TASK, C_DUE_DATE, C_PRIORITY}; Cursor cursor = db.query(TABLE_NAME, columns, null, null, null, null, null); return cursor; } class DbHelper extends SQLiteOpenHelper { public DbHelper() { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String sql = String.format("create table %s" + "(%s int primary key, %s text, %s text, %s int)", TABLE_NAME, C_ID, C_TASK, C_DUE_DATE, C_PRIORITY); Log.d(TAG, "onCreate with SQL:"+sql); db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("drop if exists " + TABLE_NAME); onCreate(db); } } }
Here is the ToDoItem object class I am trying to update the priority when an item is clicked
public class ToDoItem { private String task; private String dueDate; private int priority; public ToDoItem(String task) { this.task = task; this.priority = 1; } public ToDoItem(String task, String dueDate) { this.task = task; this.dueDate = dueDate; this.priority = 1; } public ToDoItem(String task, int priority) { this.task = task; if(priority <=3 && priority > 0) { this.priority = priority; } else this.priority = 1; } public ToDoItem(String task, String dueDate, int priority) { this.task = task; this.dueDate = dueDate; if(priority <=3 && priority > 0) { this.priority = priority; } else this.priority = 1; } public String getTask() { return task; } public void setTask(String task) { this.task = task; } public String getDueDate() { return dueDate; } public void setDueDate(String dueDate) { this.dueDate = dueDate; } public int getPriority() { return priority; } public void setPriority(int priority) { if(priority <=3 && priority > 0) { this.priority = priority; } else this.priority = 1; } }
Finally here is my onListItemClickListener it uses an ArrayList of ToDoItems, changes the priority and calls the update method from my data class. However the values of the row that I am trying to update remain unchanged. I used Log.d to check if the correct values were being passed and they were. For some reason the changes are not happening. Any help would be appreciated.
todoList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, final int arg2, long arg3) { if(soundEnabled) { playSound(); } // Change the priority of the item inside the arrayList todoItems todoItems.get(arg2).setPriority(todoItems.get(arg2).getPriority() + 1); String name = todoItems.get(arg2).getTask(); int priority = todoItems.get(arg2).getPriority(); final ToDoItem task = new ToDoItem(name, priority); // Get the position of the task in the database int id = arg2 + 1; data.update(id, task); });
-
Wayne B Jackson about 11 yearsThe id parameter is the row position in the database and task.getTask() returns the name of the task that the user had added.
-
Marcin S. about 11 yearsMake sure that task.getTask() returns the correct row position
-
Wayne B Jackson about 11 yearsI am getting a zero I will look into changing the id.
-
Wayne B Jackson about 11 yearsThe id parameter is the correct value but I am still getting a 0 returned when I print out the update() statement.
-
Marcin S. about 11 yearsHave you replaced values.put(C_TASK, task.getTask()); with values.put(C_TASK, id); as I suggested in my answer? As I said you are passing the id but you are not using it.
-
Marcin S. about 11 yearsI can see an update now. Yes. Use the content values. Does system.out.println prints id? How about if you replace update() with replace()?
-
Wayne B Jackson about 11 yearsHow exactly would I implement replace to update a specific row. I added and it is adding a new entry with the correct priority but not replacing the existing one. I will update my code.
-
CombinatorX about 11 yearsOK, I found the reason why the DB update don't worked. "db.update(TABLE_NAME, values, C_ID +"=?"+id, null);" the second and third parameters are wrong. you can do it like this "String[] whereArgs = {String.valueOf(id)};db.update(TABLE_NAME, values, C_ID +"=?", whereArgs );"
-
Marcin S. about 11 yearsPlease also put id to ContentValues as you did earlier. To be able to replace existing row you need to pass all the table attributes; otherwise new row will be inserted.
-
Wayne B Jackson about 11 yearsThank you the issue is now solved. You pointed me in the right direction.
-
Marcin S. about 11 yearsYou are welcome. Glad that it works. Please accept the correct answer.
-
Sarz almost 9 yearsbut how you solved it? @WayneBJackson Am i wasted time on the post?
-
midou almost 2 yearsI spent an hour and am glad to find your answer Thank u very much for save my day