2016-11-08 96 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(); 
      } 

更新功能:

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中,类ID是新创建的任务 - 即使它们没有连接(?)。任何帮助将是一个伟大的。

+0

你的错误是什么?顺便说一下,您当前的查询使用原始级联构建'WHERE'子句,从而使查询容易受到SQL注入的影响。你应该参数化查询。 –

+0

@TimBiegeleisen你能给我一个提示吗?问题是 - 没有任何反应。我需要编辑任务,但它保持不变,问题是,更新函数返回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,values ,COLUMN_ID +“=?”+ new String [] {t.getID()}); 更新函数需要最后一个参数一个字符串,但你不能有一个字符串数组,当t.getID返回int,所以它给我一个错误在那一行。 – JasonM

+0

你可以像这样将int转换为字符串:String.ValueOf(t.getID)。我更新了我的答案。 –