sqlite不会更新所有属性

时间:2014-11-22 14:35:22

标签: android sqlite

我正在创建一个将任务属性存储到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));}       
问题在哪里?为什么我不能更新(名称)和(类别)?

1 个答案:

答案 0 :(得分:0)

要选择要更新的行,您使用的是task.task_nametask.category

        COLUMN_TASK_NAME + " ='"
                + task.task_name + "' AND " + 
                COLUMN_TASK_CATEGORY + " ='" + task.category
                + "'"

行更新 的值为task.task_nametask.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 });
    ...
}