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

У меня два стола, один Information а другой WorkForce

Информация

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

WorkForce

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

Двенадцать 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

  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

20

Решение

Согласно вашему коду, чтобы добавить информацию:

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

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

Что вам нужно сделать, это переместить свой код в 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 вы можете отправить обратный вызов для выполнения другой работы.

7

Другие решения

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

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

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

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 учебный класс.

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

4
По вопросам рекламы [email protected]