SQLiteDatabase update not working?

11,117

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.

Share:
11,117
Wayne B Jackson
Author by

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, 2022

Comments

  • Wayne B Jackson
    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
    Wayne B Jackson about 11 years
    The 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.
    Marcin S. about 11 years
    Make sure that task.getTask() returns the correct row position
  • Wayne B Jackson
    Wayne B Jackson about 11 years
    I am getting a zero I will look into changing the id.
  • Wayne B Jackson
    Wayne B Jackson about 11 years
    The id parameter is the correct value but I am still getting a 0 returned when I print out the update() statement.
  • Marcin S.
    Marcin S. about 11 years
    Have 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.
    Marcin S. about 11 years
    I 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
    Wayne B Jackson about 11 years
    How 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
    CombinatorX about 11 years
    OK, 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.
    Marcin S. about 11 years
    Please 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
    Wayne B Jackson about 11 years
    Thank you the issue is now solved. You pointed me in the right direction.
  • Marcin S.
    Marcin S. about 11 years
    You are welcome. Glad that it works. Please accept the correct answer.
  • Sarz
    Sarz almost 9 years
    but how you solved it? @WayneBJackson Am i wasted time on the post?
  • midou
    midou almost 2 years
    I spent an hour and am glad to find your answer Thank u very much for save my day