2016-11-08 3 views
0

Не удается найти ошибку в коде. Я уверен, что могут быть некоторые проблемы с ID. Возможно, вопросы неверны. Своего нового в этом.Невозможно обновить элемент в базе данных [sqlite]

MyDBHelper

public void onClick(DialogInterface dialog, int whichButton) { 
       String EditTextValue = edittext.getText().toString(); 
       Task t = new Task(EditTextValue); 
       dbHandler.updateTask(t); 


       if (dbHandler.updateTask(t) == true){ 
        Toast.makeText(MainActivity.this, "IR", Toast.LENGTH_LONG).show(); 
       } 
       else 
       { 
        Toast.makeText(MainActivity.this, "naah", Toast.LENGTH_LONG).show(); 
       } 
        displayTaskList(); 
      } 

функция Update:

public boolean updateTask(Task t){ 
    boolean result = false; 
    String q = "SELECT * FROM " + TABLE_NAME + " WHERE " + COLUMN_ID + " = " + t.getID(); 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor c = db.rawQuery(q, null); 
    if (c.moveToFirst()) 
    { 
     String q2 = "UPDATE " + TABLE_NAME + " SET " + COLUMN_TASK + " = " 
       + t.getTASK() + " WHERE " + COLUMN_ID + " = " + t.getID(); 
     db.execSQL(q2); 
     result = true; 
    } 
    db.close(); 
    return result; 
} 

класс Задача:

public class Task { 
private int _id; 
private String _task; 

public Task() {} 
public Task(String task){ 
    this._task = task; 
} 
public Task (int id, String task){ 
    this._id = id; 
    this._task = task; 
} 

// SETS&GETS 
public void setID(int id) { 
    this._id = id; 
} 
public int getID() { 
    return this._id; 
} 
public void setTASK(String task){ 
    this._task = task; 
} 
public String getTASK(){ 
    return this._task; 
} 
} 

Mainactivity:

// To detect which list item is selected (by ID) 
private long _id; 
public void setID(long id) { this._id = id; } 
public long getID() { return this._id; } 

// Attaches a long click listener to the listview 
private void setupListViewListener() { 
    lvTasks.setOnItemLongClickListener(
      new AdapterView.OnItemLongClickListener() { 
       @Override 
       public boolean onItemLongClick(AdapterView<?> adapter, 
               View item, int pos, long id) { 
        item1.setVisible(true); item2.setVisible(true); item3.setVisible(true); // Showing all buttons 
        setID(id); //Catches the selected items ID 
        return true; 
       } 

      }); 
} 

Проблема может заключаться в том, что она смешивает ID? Например, в Mainactivity ID, который я получаю, выбрана задача (onlongclick), но в идентификаторе класса Task/MyDBHelper это вновь созданная задача - даже если они не связаны (?). Любая помощь будет отличной.

+0

Какая у вас ошибка, если таковая имеется? Кстати, ваш текущий запрос создает предложение WHERE, используя raw concatenation, оставляя запрос уязвимым для SQL-инъекции. Вы должны параметризовать запросы. –

+0

@TimBiegeleisen Можете ли вы дать мне подсказку? Проблема в том, что ничего не происходит. Мне нужно отредактировать задачу, но она оставила ее нетронутой, и проблема в том, что функция update возвращает false (это означает, что что-то не удалось, вместо обновления и возврата true) – JasonM

ответ

0

Вы можете использовать функцию обновления, как это:

public int updateTask(Task t){ 
//i assume you open your db here 
SQLiteDatabase db = this.getWritableDatabase(); 

//put values that needs to be updated in values with column names and values 
ContentValues values = new ContentValues(); 
values.put(COLUMN_TASK,t.getTASK()); 
values.put(COLUMN_ID,t.getID()); 

// db.update(String table,ContentValues values,String whereClause,String[] whereArguments) 
int result = db.update(TABLE_NAME,values,COLUMN_ID+"=?"+new String[] {String.ValueOf(t.getID())}); 
db.close(); 
return result; 
} 

Я предполагаю, что это решит вашу проблему.

+0

@Efran Gholapour int result = db.update (TABLE_NAME, значения , COLUMN_ID + "=?" + New String [] {t.getID()}); Функция update требует последнего параметра a String, но вы не можете иметь массив String, когда t.getID возвращает int, поэтому он дает мне ошибку в этой строке. – JasonM

+0

вы можете преобразовать int в строку следующим образом: String.ValueOf (t.getID). Я обновил свой ответ. –

Смежные вопросы