2015-12-30 6 views
20

Ich habe zwei Tabelle, ist ein Information und das andere ist WorkForceWert immer 0 zurück, wo er die Nummer der Zeile eingefügt zurückgeben sollte

Informationen

enter image description here

Workforce

enter image description here

Die TWF column in Workforce verwendet die id von Informationen zu erhalten, die als 1 Rückkehr annehmen, aber es Wert 0 zurück, wenn die id in Informationen 5, twf 5 sein.

Zuerst verwende ich die a, um die Nummer der ausgewählten Zeile darzustellen und dann den Parameter a in addWorkForce. Die zeigt immer 0 an.

a=addInformation(name,weather,date2,status,first1[1],last1[1]); 
    Toast.makeText(getApplicationContext(),a+"",Toast.LENGTH_LONG).show(); 
    addWorkForce(Sub, NoP, NoH,a); 

addInformation Funktion

public long addInformation(final String name, final String weather, final String date2, final String status, final String timeIn, final String timeOut) 
    { 
     class AddInfo extends AsyncTask<String, Void, String> { 
      ProgressDialog loading; 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
       loading = ProgressDialog.show(WorkDetailsTable.this, "Please Wait",null, true, true); 
      } 

      @Override 
      protected void onPostExecute(String s) { 
       super.onPostExecute(s); 
       loading.dismiss(); 
       Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show(); 
      } 

      @Override 
      protected String doInBackground(String... params) { 

       HashMap<String, String> data = new HashMap<String,String>(); 
       data.put(Config.KEY_USER_NAME,name); 
       data.put(Config.KEY_WEATHER,weather); 
       data.put(Config.KEY_DATE,date2); 
       data.put(Config.KEY_STATUS,status); 
       data.put(Config.KEY_TIMEIN,timeIn); 
       data.put(Config.KEY_TIMEOUT,timeOut); 
       RequestHandler rh=new RequestHandler(); 
       String result = rh.sendPostRequest(Config.ADD_INFORMATION,data); 
       return result; 
      } 
     } 

     AddInfo ru = new AddInfo(); 
     ru.execute(name,weather,date2,status,timeIn,timeOut); 

     return 0; 

    } 

Kann mir jemand helfen, das Problem zu verstehen?

addInformation.php

<?php 

    if($_SERVER['REQUEST_METHOD']=='POST'){ 

     //Getting values 
     $name = $_POST['name']; 
     $weather = $_POST['weather']; 
     $date = $_POST['date']; 
       $status = $_POST['status']; 
       $timeIn = $_POST['timeIn']; 
       $timeOut = $_POST['timeOut']; 

     //Creating an sql query 
     $sql = "INSERT INTO information(name, weather, date, status, time_in, time_out) VALUES ('$name','$weather','$date', '$status', '$timeIn', '$timeOut')"; 

     //Importing our db connection script 
     require_once('dbConnect.php'); 

     //Executing query to database 
     if(mysqli_query($con,$sql)){ 
      echo 'Information Added Successfully'; 
     }else{ 
      echo 'Could Not Add Information'; 
     } 

     //Closing the database 
     mysqli_close($con); 
    } 
?> 

Dies ist, wie ich den Code verwendet, um die Zeile in SQLite eingefügt zu bekommen und es funktioniert

a = ts.insertTimeSheet(name, weather, date2, status, first1[1], last1[1]); 

Timesheet

public long insertTimeSheet(String name, String weather, String date, String status, String TimeIn, String TimeOut) { 
     database = dbHelper.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(MyDatabaseHelper.Name, name); 
     values.put(MyDatabaseHelper.Weather, weather); 
     values.put(MyDatabaseHelper.Date, date); 
     values.put(MyDatabaseHelper.Status, status); 
     values.put(MyDatabaseHelper.TimeIn_Info, TimeIn); 
     values.put(MyDatabaseHelper.TimeOut_Info, TimeOut); 
     return database.insert(MyDatabaseHelper.TABLE_INFO, null, values); // if the id in Information is 5, twf display 5 too 
+0

'Echo 'konnte keine Informationen hinzufügen'; 'John hilft Ihnen nicht, wenn Ihre Anfrage einen Fehler enthält. Sie müssen den wirklichen Fehler erhalten. Fügen Sie '' oder (mysqli_error ($ con)) '' zu 'mysqli_query()' hinzu, falls es welche geben sollte. –

+0

@ Fred-ii- kein Fehler in meinem Code. Ich will nur wissen, wie man die Anzahl der Zeilen der Tabelle Info zu WorkForce –

+0

Es sollte 1 zu Spalte WorkForce zurückgeben. Wenn es eine zweite Zeile gibt, dann zeige 2 in workForce twf ... –

Antwort

7

Wie pro Ihre Code-Informationen hinzuzufügen:

a=addInformation(name,weather,date2,status,first1[1],last1[1]); 

Hier werden Sie addInformation auf Haupt-Thread aufrufen und halten Sie den Rückgabewert in Variable ein. Aber das Problem ist, Ihre eigentliche Implementierung von Hinzufügen von Informationen ist in doInBackground von AsyncTask getan, die tatsächlich den Job auf einem Worker-Thread (async-Aufruf) und so immer den Standardwert für a = 0 (wie ein lang ist).

Was Sie tun müssen, ist, Ihren Code zu onPostExecute Funktion von AsyncTask wie unten zu bewegen:

public void addInformation(final String name, final String weather, final String date2, final String status, final String timeIn, final String timeOut) 
    { 
     class AddInfo extends AsyncTask<String, Void, String> { 
      ProgressDialog loading; 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
       loading = ProgressDialog.show(WorkDetailsTable.this, "Please Wait",null, true, true); 
      } 

      @Override 
      protected void onPostExecute(String s) { 
       super.onPostExecute(s); 
       loading.dismiss(); 
       Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show(); 
       addWorkForce(Sub, NoP, NoH,a); 
      } 

      @Override 
      protected String doInBackground(String... params) { 

       HashMap<String, String> data = new HashMap<String,String>(); 
       data.put(Config.KEY_USER_NAME,name); 
       data.put(Config.KEY_WEATHER,weather); 
       data.put(Config.KEY_DATE,date2); 
       data.put(Config.KEY_STATUS,status); 
       data.put(Config.KEY_TIMEIN,timeIn); 
       data.put(Config.KEY_TIMEOUT,timeOut); 
       RequestHandler rh=new RequestHandler(); 
       String result = rh.sendPostRequest(Config.ADD_INFORMATION,data); 
       return result; 
      } 
     } 

     AddInfo ru = new AddInfo(); 
     ru.execute(name,weather,date2,status,timeIn,timeOut); 

    } 

Es gibt einen anderen Ansatz Rückrufe zu verwenden. Implementieren Sie eine Schnittstelle, und nach Abschluss Ihrer AsyncTask können Sie einen Rückruf senden, um einen anderen Job auszuführen.

+0

perfekte Antwort :) –

4

Ich belüge Das Problem kommt von dieser Zeile

Ihre addInformation -Methode gibt jedes Mal ein Long mit einem Wert von 0 zurück. Wenn Sie möchten, dass eine andere Nummer zurückgegeben wird, müssen Sie diese Zeile ändern.

Edit: den Überblick über Ihre Zeile zu halten, fügen Sie einen anderen Parameter Ihrer Methode Header

public long addInformation(int rowId, final String name, final String weather, final String date2, final String status, final String timeIn, final String timeOut) 
+0

Welchen Wert soll ich verwenden? –

+0

Welchen Wert auch immer Sie erwarten, dass es zurückkehrt. Wenn Sie die ID der Zeile haben möchten, müssen Sie diese als ein Feld zu Ihrer Klasse hinzufügen, so dass sie ein Teil Ihres Konstruktors sein kann und dann verwendet werden kann, um am Ende der Methode zurückzukehren. – bhooks

+0

make twf als 'Fremdschlüssel'? –

4

Sie können das lastInsertId() mysql-Funktion nach der Zeile in der ersten table.that eingefügt ist (Information) Speichern Sie den Wert von lastInsertId() in einer Variablen und verwenden Sie diese Variable zu diesem Zeitpunkt, wenn Sie eine Zeile in die nächste Tabelle einfügen.das heißt (Workforce)

+0

können Sie mehr ausarbeiten? –

4

Da AsyncTask ist eine asynchrone Aufgabe, die return 0; Zeile in Ihrer addInformation Methode immer zuerst kommt, das ist, warum Sie bekamen statt „Anzahl der Zeile eingefügt“.

Sie sollten Ihren Code wie folgt aktualisieren, achten Sie bitte auf meinen Kommentar // MOVE addWorkForce HERE.

public void addInformation(final String name, final String weather, final String date2, final String status, final String timeIn, final String timeOut) 
{ 
    class AddInfo extends AsyncTask<String, Void, String> { 
     ProgressDialog loading; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      loading = ProgressDialog.show(WorkDetailsTable.this, "Please Wait",null, true, true); 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
      loading.dismiss(); 
      Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show(); 
      addWorkForce(Sub, NoP, NoH, Long.parseLong(s)); // MOVE addWorkForce HERE 
     } 

     @Override 
     protected String doInBackground(String... params) { 

      HashMap<String, String> data = new HashMap<String,String>(); 
      data.put(Config.KEY_USER_NAME,name); 
      data.put(Config.KEY_WEATHER,weather); 
      data.put(Config.KEY_DATE,date2); 
      data.put(Config.KEY_STATUS,status); 
      data.put(Config.KEY_TIMEIN,timeIn); 
      data.put(Config.KEY_TIMEOUT,timeOut); 
      RequestHandler rh=new RequestHandler(); 
      String result = rh.sendPostRequest(Config.ADD_INFORMATION,data); 
      return result; 
     } 
    } 

    AddInfo ru = new AddInfo(); 
    ru.execute(name,weather,date2,status,timeIn,timeOut); 
} 

Dann müssen Sie nur

addInformation(name,weather,date2,status,first1[1],last1[1]);

Natürlich nennen, stellen Sie sicher, Sub, NoP, NoH Variablen innerhalb AddInfo Klasse zugänglich sind.

Hoffe es hilft!

+0

Verwenden Sie also 's' statt' a'? –

+0

Ja, weil 'return result;' innerhalb 'doInBackground'' s' innerhalb 'onPostExecute' ist. – BNK

+0

Sie können mehr unter http://developer.android.com/reference/android/os/AsyncTask.html lesen. 'The 4 steps' section für mehr Informationen über AsyncTask – BNK