MySQL-Datenbank mit Square Libraries – Insert AlertDialog Teil 5

von Ludy geschrieben am und aktualisiert am
Kategorien MySQL Datenbank
Schlagwörter , , , , ,

In der insert.php nutzen wir zum Empfangen, die POST-Methode, das wird noch wichtig für die Ausführung der Insert-Methode in der App.

insert.php

<?php
    include 'dbconn.php';
    header('Content-Type: application/json');
    $response = array();

    $manufacturer = (isset($_POST['manufacturer'], $_POST['type'])) ? $_POST['manufacturer'] : die(json_encode(array('success' => -1), JSON_PRETTY_PRINT));
    $type = (isset($_POST['manufacturer'], $_POST['type'])) ? $_POST['type'] : die(json_encode(array('success' => -1), JSON_PRETTY_PRINT));

    $insert = "INSERT INTO devices(manufacturer, type) VALUES(:manufacturer, :type)";
    $insertQuery = $conn->db->prepare($insert);
    $insertQuery->bindParam(":manufacturer", $manufacturer, PDO:: PARAM_STR);
    $insertQuery->bindParam(":type", $type, PDO:: PARAM_STR);

    if ($insertQuery->execute() && $insertQuery->errorCode() == 0) {
        echo json_encode(array('success' => 1), JSON_PRETTY_PRINT);
    } else {
        echo json_encode(array('success' => -1), JSON_PRETTY_PRINT);
    }

    $insertQuery->closeCursor();
    $conn->db = null;
?>

Wir benötigen noch eine Klasse Insert, welche für den Callback (Response) unseres ApiService gebraucht wird.

public class Insert {
    private int success;

    public int getSuccess() {
        return success;
    }
}

Zunächst erweitern wir das Interface ApiService.
@FormUrlEncoded – dadurch werden die POST-Field’s encoded.
@POST – hier wird wieder der Pfad zur Datei angegeben und gleichzeitig auf die POST-Methode verwiesen
@Field – die Felder, die im PHP-Script als POST’s verarbeitet werden sollen.

@FormUrlEncoded
@POST("/api/insert.php")
Call<Insert> insertDevice(
        @Field("manufacturer")
        String manufacturer,
        @Field("type")
        String type
);

Wir erstellen uns ein eigenes Layout, da wir zwei EditText-Views brauchen.

prompts.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin">

    <EditText
        android:id="@+id/editTextDialogManufacturer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Manufacturer">
        <requestFocus/>
    </EditText>

    <EditText
        android:id="@+id/editTextDialogType"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Type"/>
</LinearLayout>

Nun erstellen wir uns direkt eine Methode für den AlertDialog, um noch etwas Übersicht zu haben. Dazu inflate wir das Layout prompts.xml und initialisieren die EditText-Views.
In onClick des Positiv-Button werden dir die Daten aus den EditText-Views an den Server senden. Wie beim Select aus der Datenbank funktioniert das Ganze auch beim Insert zur Datenbank.

Call insertCall = apiService.insertDevice(manufacturer, type);`

Das Resultat – ob es geklappt hat oder nicht – lassen wir uns in einem Toast anzeigen.

private void showDialogInsert(Context context) {
    LayoutInflater li = LayoutInflater.from(context);
    View promptsView = li.inflate(R.layout.prompts, null);

    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
            context);
    alertDialogBuilder.setTitle("Device added");
    alertDialogBuilder.setView(promptsView);

    final EditText userInputManufacturer = (EditText) promptsView
            .findViewById(R.id.editTextDialogManufacturer);
    final EditText userInputType = (EditText) promptsView
            .findViewById(R.id.editTextDialogType);

    alertDialogBuilder
            .setCancelable(false)
            .setPositiveButton(getString(android.R.string.ok),
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            String manufacturer = userInputManufacturer.getText().toString();
                            String type = userInputType.getText().toString();
                            Call<Insert> insertCall = apiService.insertDevice(manufacturer, type);
                            insertCall.enqueue(new Callback<Insert>() {
                                @Override
                                public void onResponse(Call<Insert> call, Response<Insert> response) {
                                    switch (response.body().getSuccess()) {
                                        case -1:
                                            Toast.makeText(getApplicationContext(), "etwas ist schief gelaufen.", Toast.LENGTH_LONG).show();
                                            break;
                                        case 1:
                                            Toast.makeText(getApplicationContext(), "Alle OK.", Toast.LENGTH_LONG).show();
                                            break;
                                    }
                                }

                                @Override
                                public void onFailure(Call<Insert> call, Throwable t) {
                                    Log.e("Fail", t.getLocalizedMessage());
                                }
                            });
                        }
                    })
            .setNegativeButton(getString(android.R.string.cancel),
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                        }
                    });
    AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();
}

Aufrufen werden wir das über einen Menüpunkt, dazu brauchen wir eine menu.xml – erstellt euch die Datei mit „Android recource file“.

menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/action_add"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:icon="@android:drawable/ic_input_add"
        android:title="Add"
        app:showAsAction="always"/>
</menu>

In der MainActivity.java fügen wir die OptionMenu-Methoden ein und können nun die showDialogInsert-Methode aufrufen.

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_add:
            showDialogInsert(MainActivity.this);
            return true;
    }
    return super.onOptionsItemSelected(item);
}