2017-10-31 5 views
0

Ich habe eine Aktivität (CreateLine), die Sie unten in einem Screenshot sehen können. Wenn der Benutzer diesen Bildschirm ausfüllt und auf die grüne Schaltfläche klickt, werden die Daten erfolgreich in meiner SQLite-Datenbank gespeichert. Obwohl ich nun möchte, dass der Benutzer zum CreateLine-Bildschirm zurückkehren und die vorhandenen Daten, die er zuvor gespeichert hat, bearbeiten oder aktualisieren kann. Ich benutze einen Datenbankhelfer mit allen Datenbankfunktionen darin.Ändern von Daten in SQLite-Datenbank gespeichert - Android

Aufgrund der Tatsache, dass die Funktion insertdata() die Daten korrekt hinzugefügt habe, dachte ich, ich sollte diesen Code einfach kopieren und in eine neue Funktion namens Updatedata() einfügen, aber ich glaube nicht, dass das funktioniert. Ich bin mir nicht sicher, wohin ich von hier aus gehen soll.

Datenbankfunktionen von DatabaseHelper:

public boolean insertData(String linetype, String packagetype, String quantity, String duration, String starttime, String endtime) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(COL_2, linetype); 
    contentValues.put(COL_3, packagetype); 
    contentValues.put(COL_4, quantity); 
    contentValues.put(COL_5, duration); 
    contentValues.put(COL_6, starttime); 
    contentValues.put(COL_7, endtime); 
    long result = db.insert(TABLE_NAME, null, contentValues); 
    if (result == -1) 
     return false; 
    else 
     return true; 
} 

public boolean updateData(String linetype, String packagetype, String quantity, String duration, String starttime, String endtime) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(COL_2, linetype); 
    contentValues.put(COL_3, packagetype); 
    contentValues.put(COL_4, quantity); 
    contentValues.put(COL_5, duration); 
    contentValues.put(COL_6, starttime); 
    contentValues.put(COL_7, endtime); 
    long result = db.update(TABLE_NAME,contentValues, null, null); 
    if (result == -1) 
     return false; 
    else 
     return true; 

CreateLine Klasse (Code hinter überprüfen oder grüne Taste):

VerifyButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View view) { 

      String spinnerSelection = String.valueOf(spinner.getSelectedItem()); 
      String spinnerSelection2 = String.valueOf(spinner2.getSelectedItem()); 
      String q = quantity.getText().toString(); 
      String d = duration.getText().toString(); 

      DateTime dateTime = new DateTime(yearNow, monthNow, dayNow, hourNow, minuteNow); 
      DateTimeFormatter fmt = DateTimeFormat.forPattern("E d MMM yyyy" + "\n" + " h:mm a "); 
      String formattedtime = fmt.print(dateTime); 
      CalculateButton.setText(formattedtime); 

      // Plus some hours, minutes, and seconds to the original DateTime. 
      DateTimeFormatter fmt2 = DateTimeFormat.forPattern("E d MMM yyyy" + "\n" + " h:mm a "); 

      DateTime dateTime1 = dateTime.plusHours(timeadded); 
      String endtimecalc = fmt2.print(dateTime1); 
      TextView endtime = (TextView) findViewById(endtimetextView); 
      endtime.setVisibility(View.VISIBLE); 
      endtime.setText(endtimecalc); 


      //INSERT DATA TO DATABASE 
      boolean isInserted = myDb.insertData(
        spinnerSelection, 
        spinnerSelection2, 
        q, 
        d, 
        formattedtime, 
        endtimecalc); 


      if (isInserted == true) 
       Toast.makeText(CreateLine.this, "Data Inserted Successfully", Toast.LENGTH_LONG).show(); 



      boolean isUpdated = myDb.updateData(
         spinnerSelection, 
         spinnerSelection2, 
         q, 
         d, 
         formattedtime, 
         endtimecalc); 
      if (isUpdated == true) 
       Toast.makeText(CreateLine.this, "Data Successfully updated!" , Toast.LENGTH_LONG).show(); 

Screenshot von CreateLine Aktivität:

CreateLine

Ich bin Ich denke, ich könnte eine Art IF-Station brauchen überprüfen, ob bereits Daten vorhanden sind, bevor die Update-Funktion verwendet wird?

Wer irgendwelche Ideen?

+0

vorhanden ist, wo Sie 'Updatedata()' nennen? –

+0

Wenn Sie sehen können, wo ich kommentierte // UPDATE DATA, die Zeile darunter, dann übergebe ich die zu aktualisierenden Strings – TheAlmac2

+0

Warum 'updateData' Methode ist genau ** das gleiche wie' insertData', es ruft sogar 'db .insert' ??? – pleft

Antwort

0

Sie sollten überprüfen, ob die Daten vorhanden sind oder nicht. Wenn nein, dann füge ein, ansonsten Daten aktualisieren.

Beispiel in onClick

boolean check = doesDataExist(spinnerSelection,spinnerSelection2,q,d,formattedtime,endtimecalc); 

    if(check==true) // data exists 
    { 
     myDb.updateData(spinnerSelection,spinnerSelection2, q, d, formattedtime, 
     endtimecalc); // updata data 
    } 
    else 
    { 
     myDb.insertData(spinnerSelection, spinnerSelection2,q,d, 
     formattedtime,endtimecalc); // insert data 
    } 

Und hier das Beispiel zu prüfen, ob Daten

public boolean doesDataExist(String spinnerSelection,..,..,..,..,..){ 
    final String query = "SELECT stationName FROM review WHERE stationId='"+name+"' LIMIT 1"; // write query here 
     SQLiteDatabase database = getReadableDatabase(); 
     Cursor c = database.rawQuery(query, null)) { 
     return c.moveToFirst(); 
    } 
+0

Wenn ich einen Primärschlüssel habe, der jede Zeile unterscheidet, wie B1 für Zeile 1 und B2 für Zeile 2 .. muss ich separate Funktionen für jede Zeile schreiben oder wie kann ich den Primärschlüssel übergeben damit es weiß, welche Zeile aktualisiert werden soll? – TheAlmac2

+0

Im 'if (check == true)' können Sie eine weitere Funktion zum Abrufen des Primärschlüssels erstellen. Sobald Sie die ID erhalten haben, können Sie an die 'updateData'-Funktion übergeben, und es wird' myDb.updateData (ID, spinnerSelection, spinnerSelection2, q, d, formatierte Zeit, endtimecalc); ' –

+0

Um die Abfrage zu erhalten, finden Sie unter https://stackoverflow.com/a/14017956/5156075 –

Verwandte Themen