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.
C
all 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);
}