2017-06-16 1 views
0

Ich bin ziemlich neu mit SQL in Android-Apps, und ich habe einige Probleme, um die Tabelle, die ich mit einer ListView erstellt habe ich mit ihm zu aktualisieren. Ich kann ein Element aus der listView aktualisieren, aber es ist nicht das richtige, es ist immer das erste Element aus der Liste, das sich ändert.Android - Ich kann Daten von SQLite-Datenbank nicht aktualisieren

Ich habe eine Tabelle gemacht mit nur einer Spalte (Ich werde mehr zwei später hinzufügen) und hier ist, wie ich es bauen:

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(); 
} 

Ich mache einen Aufruf an die Update-Funktion in die item_todo.xml Datei 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" /> 
<!-- ... --> 

mit Ich verstehe, dass ich nicht die richtige ID bekommen, aber ich kann nicht einen Weg zu finden scheinen Holen Sie sich das richtige Element aus der listView. Wenn Sie einen Blick auf die Zeile String sql werfen, erreiche ich das Element nur aus einer Zeile, die einen String-Daten vergleicht, und nicht durch Ids. Kann mir jemand dabei helfen? Vielen Dank!

EDIT: Bild aus der Liste selbst.

+1

wenn Sie den Wert in Text hinzufügen, um die ID auch zu speichern und verwenden Sie die ID in "edita_Materia" –

+0

Ich verstehe nicht. Kannst du mir zeigen, wie ich eine solche ID speichern kann? Der Anruf kommt von einem XML-'android: onClick', ich bin mir nicht sicher, wie genau ich eine ID bekommen kann, die von ihm kommt. –

+0

Wie stellen Sie einen Wert in Text ein ..? –

Antwort

0

Sie versuchen, ein Listenelement zu aktualisieren, wenn Sie auf die Schaltfläche acceitarBotao geklickt haben? Wenn ja, würde ich vorschlagen, eine Funktion aufzurufen, die Daten von sqlite für diese sprizifische ID abruft (die Position des geklickten Listeneintrags ist die ID) und dieses spezifische Listenelement aktualisiert und dann die Methode notifyDatasetChanged aufruft, um den adapterspezifischen Eintrag zu benachrichtigen list item hat sich geändert, also würde es den listview richtig korrigieren.

+0

Das versuche ich herauszufinden. Ich habe den originalen Beitrag bearbeitet und ich habe dort ein Bild von der Liste hinzugefügt, damit du eine Idee haben kannst. Ich habe keine Ahnung, wie ich die Position mit 'android: onclick' aus der Liste abrufen kann. Können Sie mir einen Weg vorschlagen, diese Position wiederzufinden? Vielen Dank! –

+0

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

+0

Ich sehe, was du meinst, aber es zeigt nicht, wie ich die Position mit 'android: onClick' aber abrufen eher 'setOnItemClickListener', also soll ich es anstelle eines direkten Funktionsaufrufs von XML benutzen? –

Verwandte Themen