2017-06-16 106 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的直接函数调用? –