20 votes

La valeur renvoie toujours 0 alors qu'elle devrait renvoyer le nombre de lignes insérées.

J'ai deux tableaux, l'un est Information et l'autre est WorkForce

Information

enter image description here

WorkForce

enter image description here

Le twf column sur WorkForce est utilisé pour obtenir le id de Information qui devrait être égal à 1, mais qui renvoie la valeur 0. Si le id sur L'information est 5, twf devrait être de 5 aussi.

Tout d'abord, j'utilise le a pour représenter le nombre de lignes sélectionnées et ensuite ajouter le paramètre de a en addWorkForce . Le site toast affiche toujours 0 .

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

fonction addInformation

  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;

    }

Quelqu'un peut-il m'aider à résoudre le problème ?

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

Voici comment j'ai utilisé le code pour obtenir la ligne insérée dans sqlite et cela fonctionne.

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

Feuille de temps

 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

7voto

Gagan Singh Points 723

Selon votre code pour ajouter des informations :

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

Ici, vous appelez addInformation sur le fil d'exécution principal et conserve la valeur de retour dans la variable a. Mais le problème est que l'implémentation réelle de l'ajout d'informations est effectuée dans le fil d'exécution principal. doInBackground de AsyncTask qui effectue en fait le travail sur un fil de travail (appel asynchrone) et vous obtiendrez donc toujours la valeur par défaut pour a=0 (car a est long).

Ce que vous devez faire est de déplacer votre code vers onPostExecute fonction de AsyncTask comme ci-dessous :

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

    }

Il existe une autre approche pour utiliser les callbacks. Implémentez une interface et après l'achèvement de votre AsyncTask, vous pouvez envoyer un callback pour effectuer une autre tâche.

4voto

bhooks Points 174

Je crois que le problème vient de cette ligne

return 0;

Votre méthode addInformation renvoie un long avec une valeur de 0 à chaque fois. Si vous voulez qu'elle renvoie un autre nombre, vous devrez modifier cette ligne.

Modifier : Pour garder la trace de votre rangée, ajoutez un autre paramètre à l'en-tête de votre méthode

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

4voto

nandit Points 46

Vous pouvez utiliser la fonction mysql lastInsertId() après l'insertion d'une ligne dans la première table, c'est-à-dire (Information) stocker la valeur de lastInsertId() dans une variable et utiliser cette variable au moment où vous insérez une ligne dans le tableau suivant. c'est-à-dire (WorkForce)

4voto

BNK Points 7177

Depuis AsyncTask est une tâche asynchrone, le return 0; dans votre addInformation La méthode passe toujours en premier, c'est pourquoi vous avez obtenu 0 au lieu de "nombre de lignes insérées" .

Vous devez mettre à jour votre code comme suit, s'il vous plaît prêter attention à mon commentaire // 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);  
}

Ensuite, il suffit d'appeler

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

Bien sûr, assurez-vous Sub, NoP, NoH sont accessibles à l'intérieur de AddInfo classe.

J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X