2017-06-16 26 views
0

私はAndroidアプリではSQLを使用して新しくなりました。私が使用したリストビューで作成したテーブルを更新するのに問題があります。私はリストビューから要素を更新することができますが、それは正しいものではなく、常にリストの最初のものです。Android - 私はSQLiteデータベースからデータを更新できません

私は1列のみで表を作ってきた(私は後にさらに2つを追加するもの)と、ここで私はそれ構築する方法です:

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

私は右のIDを取得していないですが、私はへの道を見つけるように見えることができないことを理解し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" /> 
<!-- ... --> 

を使用してitem_todo.xmlファイルに更新関数の呼び出しを行いますリストビューから適切な要素を取得します。 String sql行を見てみると、Idからではなく、文字列データを比較する行からのみ要素に到達します。誰かが私を助けることができますか?ありがとう!

EDIT:リスト自体からの画像。 Image example for the listView.

+1

また、idを保存して "edita_Materia"のIDを使用する場合は、テキストに値を追加してください。 –

+0

わかりません。私はそのようなIDをどのように保存することができますか?この呼び出しはXML'android:onClick'から来ています。私はそれから来るIDをどのように取得できるのか正確にはわかりません。 –

+0

テキストの値をどのように設定していますか? –

答えて

0

Arボタンをクリックするとリストアイテムを更新しようとしていますか? もしそうなら、sprcific ID(クリックされたlistitemの位置はID)のsqliteからデータを取り出し、その特定のリスト項目を更新し、メソッドnotifyDatasetChangedを呼び出してアダプタにsprcificを通知する関数を呼び出すことをお勧めしますリスト項目が変更されたため、リストビューが適切にuldateされます。

+0

これは私が見つけようとしていることです。私は元の投稿を編集していますので、そこからイメージを追加してアイデアを出すことができます。私は 'android:onclick'を使ってどのようにリストから位置を取得できるのか分かりません。あなたは私にその位置を取得する方法を提案できますか?ありがとう! –

+0

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

+0

私はあなたが意味するものを見ていますが、どのように私は 'android:onClick'を使って位置を取得するのかを示していませんがむしろ 'setOnItemClickListener'なので、XMLからの直接関数呼び出しの代わりにそれを使用したいのですか? –

関連する問題