php - studio - El valor siempre devuelve 0 donde debería devolver el número de filas insertadas
login-en-android-usando-php-y-mysql (4)
Tengo dos tablas, una es Information
y la otra es WorkForce
Información
Personal
La column
twf en WorkForce se usa para obtener el id
de la información , que supone un retorno como 1, pero devuelve el valor 0. Si el id
en la información es 5, twf
debe ser 5.
En primer lugar, uso la a
para representar el número de filas seleccionadas y luego agrego el parámetro a
en addWorkForce
. La toast
siempre muestra 0.
a=addInformation(name,weather,date2,status,first1[1],last1[1]);
Toast.makeText(getApplicationContext(),a+"",Toast.LENGTH_LONG).show();
addWorkForce(Sub, NoP, NoH,a);
función 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;
}
¿Puede alguien ayudarme a resolver el problema?
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);
}
?>
Así es como utilicé el código para insertar la fila en sqlite y funciona.
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
Creo que el problema viene de esta línea.
return 0;
Su método addInformation devuelve un valor largo con un valor de 0 cada vez. Si desea que devuelva algún otro número, deberá cambiar esa línea.
Editar: para mantener un registro de su fila, agregue otro parámetro al encabezado de su método
public long addInformation(int rowId, final String name, final String weather, final String date2, final String status, final String timeIn, final String timeOut)
Dado que AsyncTask es una tarea asíncrona, el return 0;
La línea en su método addInformation
siempre es lo primero, por eso obtuvo 0 en lugar de "número de fila insertada" .
Debe actualizar su código como se // MOVE addWorkForce HERE
continuación, preste atención a mi comentario // 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);
}
Entonces, solo necesitas llamar
addInformation(name,weather,date2,status,first1[1],last1[1]);
Por supuesto, asegúrese de que las variables Sub, NoP, NoH
sean accesibles dentro de la clase AddInfo
.
¡Espero eso ayude!
Puede usar la función mySql lastInsertId () después de la fila insertada en la primera tabla. Eso es (Información) almacenar el valor de lastInsertId () en alguna variable y usar esa variable en ese momento cuando inserte la fila en la siguiente tabla. eso es (WorkForce)
Según su código para agregar información:
a=addInformation(name,weather,date2,status,first1[1],last1[1]);
Aquí, está llamando a addInformation
en el hilo principal y retiene el valor de retorno a la variable a. Pero el problema es que su implementación real de agregar información se realiza en doInBackground
de AsyncTask
que en realidad realiza el trabajo en un subproceso de trabajo (llamada asíncrona), por lo que siempre obtendrá el valor predeterminado para a = 0 (ya que es largo).
Lo que debe hacer es mover su código a la función AsyncTask
de AsyncTask
como a continuación:
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);
}
Hay otro enfoque para utilizar devoluciones de llamada. Implemente una interfaz y después de completar su AsyncTask, puede enviar una devolución de llamada para hacer otro trabajo.