Подтвердить что ты не робот

Значение всегда возвращает 0, где он должен возвращать число вставленной строки

У меня две таблицы, одна - Information, а другая - WorkForce

Информация

введите описание изображения здесь

WorkForce

введите описание изображения здесь

twf column в WorkForce используется для получения id информации, которая предположительно возвращает как 1, но возвращает значение 0. Если id в Информация 5, twf тоже должно быть 5.

Во-первых, я использую a для представления числа выбранной строки, а затем добавьте параметр a в addWorkForce. На дисплее toast всегда отображается 0.

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

addInformation function

  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;

    }

Может кто-нибудь помочь мне разобраться с проблемой?

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

Вот как я использовал код, чтобы получить строку, вставленную в sqlite, и она работает

 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
4b9b3361

Ответ 1

В соответствии с вашим кодом для добавления информации:

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

Здесь вы вызываете addInformation в основном потоке и сохраняете возвращаемое значение переменной a. Но проблема в том, что ваша фактическая реализация добавления информации выполняется в doInBackground из AsyncTask, которая фактически выполняет задание в рабочем потоке (асинхронный вызов), и поэтому вы всегда будете получать значение по умолчанию для a = 0 (как длинный).

Что вам нужно сделать, это перевести код на onPostExecute функцию AsyncTask, как показано ниже:

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

    }

Существует другой подход к использованию обратных вызовов. Внедрите интерфейс и после завершения работы AsyncTask вы можете отправить обратный вызов для выполнения другого задания.

Ответ 2

Я полагаю, что проблема исходит из этой строки

return 0;

Ваш метод addInformation возвращает значение long со значением 0 каждый раз. Если вы хотите, чтобы он возвращал какой-то другой номер, вам нужно будет изменить эту строку.

Изменить: Чтобы отслеживать вашу строку, добавьте еще один параметр в заголовок вашего метода

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

Ответ 3

Вы можете использовать функцию lastInsertId() mysql после строки, вставленной в первую таблицу. Это (информация) сохраните значение lastInsertId() в некоторой переменной и используйте эту переменную в то время, когда вы вставляете строку в следующую таблицу. то есть (WorkForce)

Ответ 4

Так как AsyncTask является асинхронной задачей, строка return 0; в вашем методе addInformation всегда на первом месте, поэтому вы получили 0 вместо "числа вставленной строки.

Вы должны обновить свой код следующим образом, обратите внимание на мой комментарий // 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);  
}

Затем вам нужно только позвонить

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

Конечно, убедитесь, что переменные Sub, NoP, NoH доступны внутри класса AddInfo.

Надеюсь, что это поможет!