2017-06-16 152 views
0

我很新的在Android應用程序中使用SQL,我有一些麻煩來更新我創建的表與我使用的listView。我設法從listView更新一個元素,但它不是正確的,它總是第一個從列表中更改。Android - 我無法從SQLite數據庫更新數據

我已經做了表只有一列(我將稍後添加更多二),這裏是我如何構建它:

TaskContract_Faltas.java

class TaskContract_Faltas { 
    static final String DB_NAME = "com.example.TodoList.db.tasks"; 
    static final int DB_VERSION = 1; 
    static final String TABLE = "tasks"; 

    class Columns { 
     static final String TASK = "task"; 
     static final String _ID = BaseColumns._ID; 
    } 
} 

TaskDbHelper_Faltas

class TaskDbHelper_Faltas extends SQLiteOpenHelper { 

TaskDbHelper_Faltas(Context context) { 
    super(context, TaskContract_Faltas.DB_NAME, null, TaskContract_Faltas.DB_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase sqlDB) { 
    String sqlQuery = 
      String.format("CREATE TABLE %s (" + 
          "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
          "%s TEXT)", TaskContract_Faltas.TABLE, 
        TaskContract_Faltas.Columns.TASK); 

    Log.d("TaskDBHelper","Query to form table: "+sqlQuery); 
    sqlDB.execSQL(sqlQuery); 
} 

@Override 
public void onUpgrade(SQLiteDatabase sqlDB, int i, int i2) { 
    sqlDB.execSQL("DROP TABLE IF EXISTS "+TaskContract_Faltas.TABLE); 
    onCreate(sqlDB); 
} 
} 

Faltas.java

ListView lista; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.faltas2); 
    setTitle("Gerenciador de Faltas"); 

    lista = (ListView) findViewById(R.id.lista_falta); 

    updateUI(); 

} 

//... 

public void edita_Materia(View view){ 

    final Dialog dialog = new Dialog(Faltas2.this); 
    dialog.setContentView(R.layout.janela_faltas_add); 

    TextView titulo = (TextView) dialog.findViewById(R.id.Titulo_Dialog); 
    titulo.setText("Editar Matéria"); 

    Button cancelarBotao = (Button) dialog.findViewById(R.id.botao_cancelar); 
    Button aceitarBotao = (Button) dialog.findViewById(R.id.botao_aceitar); 
    final EditText nome_materia = (EditText) dialog.findViewById(R.id.texto_disciplina_falta); 

    // The error starts here 
    TextView texto = (TextView) findViewById(R.id.Titulo_disciplina); 
    nome_materia.setText(texto.getText().toString(), TextView.BufferType.EDITABLE); 

    final String teste = texto.getText().toString(); 
    // From here   

    cancelarBotao.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      dialog.dismiss(); 
     } 
    }); 

    aceitarBotao.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String task = nome_materia.getText().toString(); 

      String sql = String.format("UPDATE %s SET %s = '%s' WHERE %s = '%s'", 
        TaskContract_Faltas.TABLE, 
        TaskContract_Faltas.Columns.TASK, 
        task, 
        TaskContract_Faltas.Columns.TASK, 
        teste); 

      Log.d("Faltas2", "A ID eh: " + TaskContract_Faltas.Columns._ID); 

      helper = new TaskDbHelper_Faltas(Faltas2.this); 
      SQLiteDatabase sqlDB = helper.getWritableDatabase(); 
      sqlDB.execSQL(sql); 
      updateUI(); 
      dialog.dismiss(); 
     } 
    }); 

    dialog.show(); 
} 

private void updateUI() { 

    helper = new TaskDbHelper_Faltas(Faltas2.this); 
    SQLiteDatabase sqlDB = helper.getReadableDatabase(); 
    Cursor cursor = sqlDB.query(TaskContract_Faltas.TABLE, 
      new String[]{TaskContract_Faltas.Columns._ID, TaskContract_Faltas.Columns.TASK}, 
      null, null, null, null, null); 

    ListAdapter listAdapter = new SimpleCursorAdapter(
      this, 
      R.layout.item_todo, 
      cursor, 
      new String[]{TaskContract.Columns.TASK}, 
      new int[]{R.id.Titulo_disciplina}, 
      0 
    ); 
    lista.setAdapter(listAdapter); 
    visi_info(); 
} 

我做出了更新函數的調用到item_todo.xml文件中使用android:onClick="edita_Materia"

<!-- ... --> 
<ImageButton 
    android:id="@+id/botao_editar" 
    android:src="@drawable/ic_edit_black_24dp" 
    android:layout_width="50dp" 
    android:layout_height="50dp" 
    android:scaleType="fitCenter" 
    android:adjustViewBounds="true" 
    android:onClick="edita_Materia" 
    android:background="@drawable/botao_borda_falta" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentEnd="true" 
    android:contentDescription="@string/botao_materia" /> 
<!-- ... --> 

我明白,我沒有得到正確的ID,但我似乎無法找到一種方法來從listView中獲取正確的元素。如果您看一下String sql行,我只能從一行比較字符串數據到達元素,而不是通過Ids。有人可以幫助我嗎?謝謝!

編輯:圖片從列表本身。 Image example for the listView.

+1

當你在texto中添加值時,也保存id並在「edita_Materia」中使用id –

+0

我不明白。你能告訴我如何保存這樣的身份證嗎?這個調用來自一個XML'android:onClick',我不確定如何從中取回一個id。 –

+0

你如何在texto ..中設置一個值? –

回答

0

你試圖更新一個列表項,當點擊按鈕accitarBotao? 如果是這樣,我會建議調用一個函數,該函數從sqlite中爲該spidific ID獲取數據(被單擊的listitem的位置是id)並更新該特定列表項並調用方法notifyDatasetChanged來通知適配器sp spidific列表項已更改,因此它會正確使用listview。

+0

這就是我想找到的。我編輯了原始文章,並在列表中添加了一個圖像,以便您可以有一個想法。我不知道如何使用'android:onclick'從列表中檢索位置。你能否建議我找回這個位置?謝謝! –

+0

https://stackoverflow.com/questions/20541821/get-listview-item-position-on-button-click –

+0

我明白你的意思,但它不顯示如何使用'android:onClick'獲取位置,但是而是'setOnItemClickListener',所以你希望我使用它來代替XML的直接函數調用? –