Что я пытаюсь сделать
Я пытаюсь реализовать простую автономную функцию в своем приложении, которая уходит от сотрудников, когда устройство находится в автономном режиме, и обновляет данные, которые отправляются на сервер, когда устройство находится в сети, для которых я делаю следующие шаги
Все это работает нормально, и данные также размещаются на веб-сервере должным образом, но проблема в том, что они публикуются только в первый раз, после чего они не работают.
Что я знаю до сих пор о проблеме
Каждый раз, когда я делаю чистую установку, она работает отлично, но когда я снова пытаюсь сделать еще один сетевой вызов для публикации данных, тогда он не работает, вместо этого, volley показывает неверный код ответа, который является успешным, но на серверной стороне данные вообще не были опубликованы.
У меня был эхо 1 для успеха и 0 для сбоя в PHP-бэкэнде, но я не знаю, почему залп возвращает 1 каждый раз, даже если данные не опубликованы
leaveFragment
if (isNetworkAvailable(getContext())) {
BackgroundWorkerLeave backgroundWorker = new BackgroundWorkerLeave(getContext());
backgroundWorker.execute("leave", from_date, to_date, day_count, leave_type, reason, emp_id);
} else {
// save data offline
db = new DatabaseHelper(getContext());
db.insertItem(from_date, to_date, day_count, leave_type, reason);
}
NetworkChangeRecevier // широковещательный приемник для мониторинга изменений сети
открытый класс MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.v("MyReceiver","Received intent..");
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.CONNECTED) {
DatabaseHelper db = new DatabaseHelper(context);
int count = db.getofflineCount();
// Toast.makeText(context, String.valueOf(count), Toast.LENGTH_LONG).show();
//
if (count > 0) {
Toast.makeText(context, "Internet connected updating data...", Toast.LENGTH_SHORT).show();
OfflineWorkerLeave offlineWorkerLeave = new OfflineWorkerLeave(context, db.getAllOfflineLeave());
offlineWorkerLeave.updateLeave();
}else {
Toast.makeText(context, "All updated", Toast.LENGTH_SHORT).show();
}
} else if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.DISCONNECTED) {
Toast.makeText(context, "Offline mode activated..", Toast.LENGTH_SHORT).show();
}
}
}
}
DatabaseHelper.class
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "my.db";
private static final String TABLE_NAME = "employee_leave";
private static final String COL_ID = "col_id";
private static final String COL_DAYCOUNT = "daycount";
private static final String COL_FROM = "from_date";
private static final String COL_TO = "to_date";
private static final String COL_TYPE = "type";
private static final String COL_REASON = "reason";
Context context;
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS leave(date_applied varchar, date_leave varchar, status varchar);");
db.execSQL("CREATE TABLE IF NOT EXISTS " +
TABLE_NAME + " (" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COL_FROM +
" TEXT," + COL_TO + " TEXT," + COL_DAYCOUNT +
" TEXT," + COL_TYPE + " TEXT," +
COL_REASON + " TEXT);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
//this method will add users in the database
public void insertItem(String from, String to, String status) {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("INSERT INTO leave VALUES ('" + from + "','" + to + "','" + status + "');");
db.close();
}
public void insertItem(String from, String to, String day_count, String leave_type, String reason) {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("INSERT INTO " + TABLE_NAME + " (from_date,to_date,daycount,type,reason)" +
" VALUES ('" + from + "','" + to + "','" + day_count + "','" +
leave_type + "','" + reason + "');");
Toast.makeText(context, "Leave stored on the device", Toast.LENGTH_LONG).show();
db.close();
}
public int getofflineCount() {
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery("SELECT * from " + TABLE_NAME, null);
return c.getCount();
}
public Map<String, String> getAllOfflineLeave() {
Map<String, String> params = new HashMap<String, String>();
SharedPreferences sp_login = context.getSharedPreferences("login_status", Context.MODE_PRIVATE);
SharedPreferences.Editor login_editor = sp_login.edit();
String emp_id = sp_login.getString("userid", "null");
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery("SELECT * from " + TABLE_NAME + " ORDER BY " + COL_ID + " DESC LIMIT 1", null);
if (c.moveToFirst()) {
params.put("from_date", c.getString(1));
params.put("to_date", c.getString(2));
params.put("day_count", c.getString(3));
params.put("leave_type", c.getString(4));
params.put("reason", c.getString(5));
params.put("emp_id", emp_id);
}
c.close();
db.close();
return params;
}
public List<Model> getAllLeave() {
List<Model> leaveList = new ArrayList<>();
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery("SELECT * from leave", null);
while (c.moveToNext()) {
Model logs = new Model();
String status = "";
logs.setFdate(c.getString(0));
logs.setTdate(c.getString(1));
if (c.getString(2).equals("0")) {
status = "Rejected";
} else if (c.getString(2).equals("2")) {
status = "Approved";
} else {
status = "Pending";
}
logs.setLeaveReason(status);
leaveList.add(logs);
}
c.close();
db.close();
return leaveList;
}
public void deleteRecord() {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("DELETE from leave");
db.close();
}
public void deleteOfflineRecord() {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("DELETE from " + TABLE_NAME);
db.close();
}
}
offlineWorkerleave.class
public class OfflineWorkerLeave {
Context context;
DatabaseHelper db;
Map<String, String> params;
public OfflineWorkerLeave(Context context, Map<String, String> params) {
this.context = context;
this.params = params;
db = new DatabaseHelper(context);
}
public void updateLeave() {
String url = "exapmle.com/applyleave.php";
StringRequest request = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if (response.contains("1\t")){
Toast.makeText(context, "Successfully data updated", Toast.LENGTH_SHORT).show();
db.deleteOfflineRecord();
} else if (response.contains("0\t")){
Toast.makeText(context, "Something went wrong", Toast.LENGTH_SHORT).show();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(context, error.toString(), Toast.LENGTH_SHORT).show();
}
}) {
@Override
protected Map<String, String> getParams() {
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(context);
requestQueue.add(request);
}
}
applyLeave.php
<?php
require_once("connect.php");
date_default_timezone_set("Asia/Kolkata");
$date = date('Y-m-d H:i:s');
$ldate = $_POST['from_date'];
$reason = $_POST['reason'];
$leavetype = $_POST['leave_type'];
$to_date = $_POST['to_date'];
$daycount = $_POST['day_count'];
$emp_id = $_POST['emp_id'];
$todaydate = date('d-m-Y');
if(strtotime($ldate) > strtotime($to_date))
{
echo "Please Select appropriate Dates";
}
else
{
$stmt = $mysqli->prepare("INSERT INTO empleave (empid, leave_date, leave_todate, daycount, reason, leavetype, createdDate) VALUES (?,?,?,?,?,?,?)");
$stmt->bind_param ( "issssss", $emp_id, $ldate, $to_date, $daycount, $reason, $leavetype, $date);
if($stmt->execute ())
{
echo "1";
}
else
{
echo "0";
}
}
?>
Я не понимаю этой проблемы, единственное, что я могу сделать, — это выполнить эту работу, поскольку я обнаружил, что необходимо вручную очистить данные приложения и запустить его снова, поскольку приложение работает только в первый раз, а затем после неверного успешного ответа от залпа.
Все еще пытаюсь заставить это работать и дайте мне знать вас, если кто-то хочет узнать больше об этом.
Задача ещё не решена.
Других решений пока нет …