обновление онлайн БД с помощью JSON Android - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь обновить свою онлайн-базу данных из приложения для Android с помощью JSON. Если я пытаюсь это сделать, в выводе SQL говорится, что все поля пусты, поэтому ничего не обновляется. Я попытался изменить онлайн-код, чтобы он проверял имя вместо идентификатора, но поскольку оба они не заполнены, это не помогло. Надеюсь, вы можете помочь? Вот код (вас больше всего заинтересует функция saveTask ()):

EditActivity:

package com.somthing.somepackage;

some imports...

public class EditActivity extends AppCompatActivity {

    EditText mNameEditText;
    EditText mReminderDateEditText;
    EditText mReminderTimeEditText;
    Bundle mCurrentTask;
    Intent intent;
    private static final String URL_POST = "https://my_site/json_put_data.php";
    private static final String URL_UPDATE = "https://my_site/json_update_data.php";
    private static final String URL_DELETE = "https://my_site/json_delete_data.php";

    private boolean mTaskHasChanged = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit);

        intent = getIntent();
        mCurrentTask = intent.getExtras();

        if (mCurrentTask == null) {
            setTitle(getString(R.string.editor_activity_title_new_task));

            invalidateOptionsMenu();
        } else {
            setTitle(getString(R.string.editor_activity_title_edit_task));
        }

        mNameEditText = (EditText) findViewById(R.id.edit_task_name);
        mReminderDateEditText = (EditText) findViewById(R.id.edit_task_reminder_date);
        mReminderTimeEditText = (EditText) findViewById(R.id.edit_task_reminder_time);

        mNameEditText.setOnTouchListener(mTouchListener);
        mReminderDateEditText.setOnTouchListener(mTouchListener);
        mReminderTimeEditText.setOnTouchListener(mTouchListener);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_edit, menu);
        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        if (mCurrentTask == null) {
            MenuItem menuItem = menu.findItem(R.id.action_delete);
            menuItem.setVisible(false);
        }
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_save:
                postData();
                finish();
                return true;
            case R.id.action_delete:
                showDeleteConfirmationDialog();
                return true;
            case android.R.id.home:
                if (!mTaskHasChanged) {
                    NavUtils.navigateUpFromSameTask(EditActivity.this);
                    return true;
                }

                DialogInterface.OnClickListener discardButtonClickListener =
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            NavUtils.navigateUpFromSameTask(EditActivity.this);
                        }
                    };

            showUnsavedChangesDialog(discardButtonClickListener);
            return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
    if (!mTaskHasChanged) {
        super.onBackPressed();
        return;
    }

    DialogInterface.OnClickListener discardButtonClickListener =
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    finish();
                }
            };

    showUnsavedChangesDialog(discardButtonClickListener);
}

private void showUnsavedChangesDialog(
    DialogInterface.OnClickListener discardButtonClickListener) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage(R.string.unsaved_changes_dialog_msg);
    builder.setPositiveButton(R.string.discard, discardButtonClickListener);
    builder.setNegativeButton(R.string.keep_editing, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            if (dialog != null) {
                dialog.dismiss();
            }
        }
    });

    AlertDialog alertDialog = builder.create();
    alertDialog.show();
}

private void showDeleteConfirmationDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage(R.string.delete_dialog_msg);
    builder.setPositiveButton(R.string.delete, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            deleteTask();
        }
    });
    builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            if (dialog != null) {
                dialog.dismiss();
            }
        }
    });

    AlertDialog alertDialog = builder.create();
    alertDialog.show();
}

private void deleteTask() {
    if (mCurrentTask != null) {
        RequestQueue queue = Volley.newRequestQueue(this);  

        StringRequest dr = new StringRequest(Request.Method.DELETE,
                URL_DELETE,
                new Response.Listener<String>()
                {
                    @Override
                    public void onResponse(String response) {
                        Log.i("delete: ", response);
                        Toast.makeText(EditActivity.this, getString(R.string.editor_delete_task_successful),
                                Toast.LENGTH_SHORT).show();
                    }
                },
                new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(EditActivity.this, getString(R.string.editor_delete_task_failed),
                                Toast.LENGTH_SHORT).show();
                    }
                }
        );
        queue.add(dr);

        finish();
    }
}

@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);

    if (mCurrentTask == null) {
        return;
    }

    String name = intent.getExtras().getString("NAME");
    String remDate = intent.getExtras().getString("REMINDERDATE");
    String remTime = intent.getExtras().getString("REMINDERTIME");

    mNameEditText.setText(name);
    mReminderDateEditText.setText(remDate);
    mReminderTimeEditText.setText(remTime);

    saveTask();
}

private void saveTask() {
    String nameString = mNameEditText.getText().toString().trim();
    String dateString = mReminderDateEditText.getText().toString().trim();
    String timeString = mReminderTimeEditText.getText().toString().trim();

    if (TextUtils.isEmpty(nameString) && TextUtils.isEmpty(dateString) &&
            TextUtils.isEmpty(timeString)) {
        return;
    }

    RequestQueue queue = Volley.newRequestQueue(this);  // this = context

    StringRequest putRequest = new StringRequest(Request.Method.PUT,
        URL_UPDATE,
        new Response.Listener<String>()
        {
            @Override
            public void onResponse(String response) {
                Log.d("Response", response);
            }
        },
        new Response.ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d("Error.Response", String.valueOf(error));
            }
        }
    )
        {
            @Override
            protected Map<String, String> getParams()
            {
                Map<String, String>  params = new HashMap<String, String> ();
                params.put("id", String.valueOf(getIntent().getExtras().getInt("id")));
                params.put("name", "Android Test insert");

                return params;
            }
        };

        queue.add(putRequest);
    };

private void postData(){
    RequestQueue queue = Volley.newRequestQueue(this);

    StringRequest postRequest = new StringRequest(Request.Method.POST,
            URL_POST,
            new Response.Listener<String>()
            {
                @Override
                public void onResponse(String response) {
                    Log.d("Response postData: ", response);
                }
            },
            new Response.ErrorListener()
            {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("Error.Response", String.valueOf(error));
                }
            }
    ) {
        @Override
        protected Map<String, String> getParams()
        {
            Map<String, String>  params = new HashMap<String, String>();
            params.put("id", "null");
            params.put("name", "Android Test update");

            return params;
        }
    };
    queue.add(postRequest);
}

private View.OnTouchListener mTouchListener = new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        mTaskHasChanged = true;
        return false;
    }
};
}

Код онлайн:

<?php

$host = "localhost";
$username = "my_un";
$password = "my_pw";
$db = "my_db";

$id = $_POST["id"];
$name = $_POST["name"];

$sql = "UPDATE table_name SET name = '$name' WHERE id = '$id';";

$con = mysqli_connect($host, $username, $password, $db);

$result = mysqli_query($con,$sql);

if($result){
    echo $sql;
}
else {
    echo "nok";
}

mysqli_close($con);

?>

Выходной оператор SQL:

UPDATE items SET name = '' WHERE id = '';
//Here is the problem, name and id are empty

1 Ответ

0 голосов
/ 29 апреля 2018

Проблема здесь в том, что ваш php-сервер ожидает id и name в качестве POST параметров, но ваш запрос на залп андроид отправляет запрос PUT вместо метода saveTask(). Обновление до POST метода следующим образом

StringRequest putRequest = new StringRequest(Request.Method.POST,
        URL_UPDATE,
        new Response.Listener<String>()
        {
            @Override
            public void onResponse(String response) {
                Log.d("Response", response);
            }
        },
        ....
...