SQLiteDatabase更新不起作用?

我试图让db.update用新值更新我的数据库的一行,但它似乎没有保存。 我查看了我的语法,但似乎无法保存数据。 插入function正在运行,但没有更新。 任何帮助,将不胜感激。 下面是我使用DbHelper对象的数据类。

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); } } } 

这是我试图在单击项目时更新优先级的ToDoItem对象类

  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  0) { this.priority = priority; } else this.priority = 1; } public ToDoItem(String task, String dueDate, int priority) { this.task = task; this.dueDate = dueDate; if(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  0) { this.priority = priority; } else this.priority = 1; } } 

最后这是我的onListItemClickListener,它使用ToDoItems的ArrayList,更改优先级并从我的数据类调用update方法。 但是,我尝试更新的行的值保持不变。 我使用Log.d检查是否传递了正确的值,它们是否正确。 由于某种原因,没有发生变化。 任何帮助,将不胜感激。

  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); }); 

你会打印db.update(TABLE_NAME,值,C_ID +“=”+ id,null)函数返回值吗?

如果返回值为0,那么DB中没有这样的“id”行记录。

我无法看到如何创建表“任务”及其属性的方式。 但是,如果更新所有属性,则可能尝试使用replace()方法。 尝试更换你的

 public void update(int id, ToDoItem task) { ... } 

有:

 public void update(int id, ToDoItem task) { ContentValues values = new ContentValues(); values.put(C_TASK, task.getTask()); values.put(C_PRIORITY, task.getPriority()); db.replace(TABLE_NAME, null, initialValues); } 

还要确保task.getTask()返回“tasks”表中存在的正确整数值。 您使用int参数调用update()方法,但是您从未在更新方法中使用它。 在您的更新方法中,您可能希望替换:

 values.put(C_TASK, task.getTask()); 

 values.put(C_TASK, id); 

我解决了这个问题,当创建任务时我没有读取C_ID,因此当数据库创建为“整数主键自动增量”时,我更改了“整数主键”,这意味着更新现在可以更新正确的行。 谢谢所有帮助我解决这个问题的人。