У меня два стола, один 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
Согласно вашему коду, чтобы добавить информацию:
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 вы можете отправить обратный вызов для выполнения другой работы.
Я считаю, что проблема исходит от этой линии
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)
Вы можете использовать функцию mysql lastInsertId () после строки, вставленной в первую таблицу. Это (Информация)
сохраните значение lastInsertId () в некоторой переменной и используйте эту переменную в то время, когда вы вставляете строку в следующую таблицу. то есть (рабочая сила)
поскольку 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
учебный класс.
Надеюсь, поможет!