我正在创建一个将任务属性存储到DB中的Android应用程序。任务表有两个主键(task_name,category)和另外3个属性。
当我更新任务时,只更新了其他三个属性,但主键没有更新。
我有另一个表(todayTasks),它有两个外键(taskName,taskCategory)在删除级联上更新级联时引用这两个主键(task_name,category)。
CREATE TABLE category_table (category_name text primary key not null, start_time_hour integer not null, start_time_minute integer not null, end_time_hour integer not null, end_time_minute integer not null);
CREATE TABLE task_table (task_name text not null, category text not null, priority text not null, time_in_H integer not null, time_in_M integer not null, PRIMARY KEY(task_name, category), FOREIGN KEY(category) REFERENCES category_table(category_name) ON DELETE CASCADE ON UPDATE CASCADE);
CREATE TABLE todayTasks (id INTEGER PRIMARY KEY AUTOINCREMENT,taskName TEXT , taskCategory TEXT ,taskHour INTEGER, taskMinute INTEGER, FOREIGN KEY(taskName, taskCategory) REFERENCES task_table(task_name, category) ON DELETE CASCADE ON UPDATE CASCADE);
这是SchedulerHelper.java(DB)上的更新方法
public int updateTask(Task task) {
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_TASK_NAME, task.task_name);
contentValues.put(COLUMN_TASK_CATEGORY, task.category);
contentValues.put(COLUMN_TASK_PRIORITY, task.priority);
contentValues.put(COLUMN_TIME_IN_HOUR, task.time_in_H);
contentValues.put(COLUMN_TIME_IN_MINUTES, task.time_in_M);
int test = sqliteDatabase.update(TASK_TABLE, contentValues,
COLUMN_TASK_NAME + " ='"
+ task.task_name + "' AND " +
COLUMN_TASK_CATEGORY + " ='" + task.category
+ "'", null);
if (test > -1) {
cont.startService(new Intent(cont, Planning.class));
}
我从像这样的活动中调用它
@Override
public void onClick(View v) {
Task editedTask = new Task(name_editText_value,category_value,
priority_value,hours_value,
minutes_value);
int test;
test = schedulerHelper.updateTask(editedTask);
if (test != -1) {
startService(new Intent(this, myService.class));}
问题在哪里?为什么我不能更新(名称)和(类别)?
答案 0 :(得分:0)
要选择要更新的行,您使用的是task.task_name
和task.category
:
COLUMN_TASK_NAME + " ='"
+ task.task_name + "' AND " +
COLUMN_TASK_CATEGORY + " ='" + task.category
+ "'"
行更新 的值为task.task_name
和task.category
:
contentValues.put(COLUMN_TASK_NAME, task.task_name);
contentValues.put(COLUMN_TASK_CATEGORY, task.category);
换句话说,此代码始终会写入行已有的相同值。
当Task
对象中的这两个值发生更改时,数据库中的行仍具有旧值,必须使用这些旧值进行搜索。
为了能够在数据库中更改这两个值,您需要记住旧值,以便可以将它们用于update
选择:
public int updateTask(Task task, String old_name, String old_cat) {
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_TASK_NAME, task.task_name);
contentValues.put(COLUMN_TASK_CATEGORY, task.category);
...
int test = sqliteDatabase.update(TASK_TABLE, contentValues,
COLUMN_TASK_NAME + " = ? AND " +
COLUMN_TASK_CATEGORY + " = ?",
new String[] { old_name, old_cat });
...
}