我的代码有问题。我似乎无法找到问题所在。我写了一些类似的代码,实际上它是相同的,只有变量才是变量名。我收到以下错误:
org.json.JSONException: No value for bog
org.json.JSONObject.get(JSONObject.java:389)
org.json.JSONObject.getJSONArray(JSONObject.java:584)
我制作了一个Android应用程序,它连接到用PHP
编写的REST API。当我在邮递员中测试它时,api功能没有问题。所以,我认为问题必须是java
代码。我使用过本教程:https://www.simplifiedcoding.net/android-mysql-tutorial-to-perform-basic-crud-operation/#Why-PHP-and-MySQL-and-Why-Not-SQLite
此外,我可以写入我的数据库,但是当我尝试从中读取数据时会出现问题。
我的代码:
package com.example.android.bookdb;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import static android.view.View.GONE;
public class MainActivity extends AppCompatActivity {
private static final int CODE_GET_REQUEST = 1024;
private static final int CODE_POST_REQUEST = 1025;
EditText editTextBogID, editTextTitel, editTextBogBeskrivelse, editTextISBN,
editTextForfatter, editTextGenre,
editTextSprog;;
ProgressBar progressBar;
ListView listView;
Button buttonAddUpdate;
List<Bog> bogList;
boolean isUpdating = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editTextBogID = (EditText) findViewById(R.id.editTextBogID);
editTextTitel = (EditText) findViewById(R.id.editTextTitel);
editTextBogBeskrivelse = (EditText) findViewById(R.id.editTextBogBeskrivelse);
editTextISBN = (EditText) findViewById(R.id.editTextISBN);
editTextForfatter = (EditText) findViewById(R.id.editTextForfatter);
editTextGenre = (EditText) findViewById(R.id.editTextGenre);
editTextSprog = (EditText) findViewById(R.id.editTextSprog);
buttonAddUpdate = (Button) findViewById(R.id.buttonAddUpdate);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
listView = (ListView) findViewById(R.id.listHentBog);
bogList = new ArrayList<>();
buttonAddUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isUpdating) {
opdaterBog();
} else {
opretBog();
}
}
});
hentBog();
}
private void opretBog() {
String Titel = editTextTitel.getText().toString().trim();
String Beskrivelse = editTextBogBeskrivelse.getText().toString().trim();
String ISBN = editTextISBN.getText().toString().trim();
String Forfatter = editTextForfatter.getText().toString().trim();
String Genre = editTextGenre.getText().toString().trim();
String Sprog = editTextSprog.getText().toString().trim();
if (TextUtils.isEmpty(Titel)) {
editTextTitel.setError("Skriv venligst navnet på bogen");
editTextTitel.requestFocus();
return;
}
if (TextUtils.isEmpty(Beskrivelse)) {
editTextBogBeskrivelse.setError("Skriv venligst beskrivelse");
editTextBogBeskrivelse.requestFocus();
return;
}
if (TextUtils.isEmpty(ISBN)) {
editTextISBN.setError("Skriv venligst ISBN-nummeret");
editTextISBN.requestFocus();
return;
}
if (TextUtils.isEmpty(Forfatter)) {
editTextForfatter.setError("Skriv venligst navnet på forfatteren");
editTextForfatter.requestFocus();
return;
}
if (TextUtils.isEmpty(Genre)) {
editTextGenre.setError("Skriv venligst bog genren");
editTextGenre.requestFocus();
return;
}
if (TextUtils.isEmpty(Sprog)) {
editTextSprog.setError("Skriv venligst sproget på bogen");
editTextSprog.requestFocus();
return;
}
HashMap<String, String> params = new HashMap<>();
params.put("Titel", Titel);
params.put("Beskrivelse", Beskrivelse);
params.put("Forfatter", Forfatter);
params.put("ISBN", ISBN);
params.put("Genre", Genre);
params.put("Sprog", Sprog);
PerformNetworkRequest request = new PerformNetworkRequest(Api.URL_OPRET_BOG, params, CODE_POST_REQUEST);
request.execute();
}
private void hentBog() {
PerformNetworkRequest request = new PerformNetworkRequest(Api.URL_HENT_BOG, null, CODE_GET_REQUEST);
request.execute();
}
private void opdaterBog() {
String id = editTextBogID.getText().toString().trim();
String Titel = editTextTitel.getText().toString().trim();
String Beskrivelse = editTextBogBeskrivelse.getText().toString().trim();
String ISBN = editTextISBN.getText().toString().trim();
String Forfatter = editTextForfatter.getText().toString().trim();
String Genre = editTextGenre.getText().toString().trim();
String Sprog = editTextSprog.getText().toString().trim();
if (TextUtils.isEmpty(Titel)) {
editTextTitel.setError("Skriv venligst navnet på bogen");
editTextTitel.requestFocus();
return;
}
if (TextUtils.isEmpty(Beskrivelse)) {
editTextBogBeskrivelse.setError("Skriv venligst beskrivelse");
editTextBogBeskrivelse.requestFocus();
return;
}
if (TextUtils.isEmpty(ISBN)) {
editTextISBN.setError("Skriv venligst ISBN-nummeret");
editTextISBN.requestFocus();
return;
}
if (TextUtils.isEmpty(Forfatter)) {
editTextForfatter.setError("Skriv venligst navnet på forfatteren");
editTextForfatter.requestFocus();
return;
}
if (TextUtils.isEmpty(Genre)) {
editTextGenre.setError("Skriv venligst bog genren");
editTextGenre.requestFocus();
return;
}
if (TextUtils.isEmpty(Sprog)) {
editTextSprog.setError("Skriv venligst sproget på bogen");
editTextSprog.requestFocus();
return;
}
HashMap<String, String> params = new HashMap<>();
params.put("id", id);
params.put("Titel", Titel);
params.put("Beskrivelse", Beskrivelse);
params.put("Forfatter", Forfatter);
params.put("ISBN", ISBN);
params.put("Genre", Genre);
params.put("Sprog", Sprog);
PerformNetworkRequest request = new PerformNetworkRequest(Api.URL_OPDATER_BOG, params, CODE_POST_REQUEST);
request.execute();
buttonAddUpdate.setText("Tilføj");
editTextTitel.setText("");
editTextBogBeskrivelse.setText("");
editTextForfatter.setText("");
editTextISBN.setText("");
editTextGenre.setText("");
editTextSprog.setText("");
isUpdating = false;
}
private void sletBog(int id) {
PerformNetworkRequest request = new PerformNetworkRequest(Api.URL_SLET_BOG + id, null, CODE_GET_REQUEST);
request.execute();
}
private void opdaterBogList(JSONArray bog) throws JSONException {
bogList.clear();
for (int i = 0; i < bog.length(); i++) {
JSONObject obj = bog.getJSONObject(i);
bogList.add(new Bog(
obj.getInt("id"),
obj.getString("Titel"),
obj.getString("Beskrivelse"),
obj.getString("ISBN"),
obj.getString("Forfatter"),
obj.getString("Genre"),
obj.getString("Sprog")
));
}
BogAdapter adapter = new BogAdapter(bogList);
listView.setAdapter(adapter);
}
private class PerformNetworkRequest extends AsyncTask<Void, Void, String> {
String url;
HashMap<String, String> params;
int requestCode;
PerformNetworkRequest(String url, HashMap<String, String> params, int requestCode) {
this.url = url;
this.params = params;
this.requestCode = requestCode;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressBar.setVisibility(View.VISIBLE);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
progressBar.setVisibility(GONE);
try {
JSONObject object = new JSONObject(s);
if (!object.getBoolean("error")) {
Toast.makeText(getApplicationContext(), object.getString("message"), Toast.LENGTH_SHORT).show();
opdaterBogList(object.getJSONArray("bog"));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
protected String doInBackground(Void... voids) {
RequestHandler requestHandler = new RequestHandler();
if (requestCode == CODE_POST_REQUEST)
return requestHandler.sendPostRequest(url, params);
if (requestCode == CODE_GET_REQUEST)
return requestHandler.sendGetRequest(url);
return null;
}
}
class BogAdapter extends ArrayAdapter<Bog> {
List<Bog> bogList;
public BogAdapter(List<Bog> bogList) {
super(MainActivity.this, R.layout.layout_bog_list, bogList);
this.bogList = bogList;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = getLayoutInflater();
View listViewEnhed = inflater.inflate(R.layout.layout_bog_list, null, true);
TextView textViewTitel = listViewEnhed.findViewById(R.id.textViewTitel);
TextView textViewOpdater = listViewEnhed.findViewById(R.id.textViewOpdater);
TextView textViewSlet = listViewEnhed.findViewById(R.id.textViewSlet);
final Bog bog = bogList.get(position);
textViewTitel.setText(bog.hentTitel());
textViewOpdater.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isUpdating = true;
editTextBogID.setText(String.valueOf(bog.hentId()));
editTextTitel.setText(bog.hentTitel());
editTextBogBeskrivelse.setText(bog.hentBeskrivelse());
editTextISBN.setText(bog.hentISBN());
editTextForfatter.setText(bog.hentForfatter());
editTextGenre.setText(bog.hentGenre());
editTextSprog.setText(bog.hentSprog());
buttonAddUpdate.setText("Opdater");
}
});
textViewSlet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Slet " + bog.hentTitel())
.setMessage("Er du sikker?")
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
sletBog(bog.hentId());
}
})
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
})
.setIcon(android.R.drawable.ic_dialog_alert)
.show();
}
});
return listViewEnhed;
}
}
}
但是,以防万一,这是我的Api代码:
// Henter DbOperation klassen.
require_once 'DbOperation.php';
// Funktionen vil validere om alle parametrene er tilgængelige.
// Vi vil sende de påkrævede parametre til denne funktion.
function isTheseParametersAvailable($params){
// Hvis all parametrene er tilgængelige.
$available = true;
$missingparams = "";
foreach($params as $param){
if(!isset($_POST[$param]) || strlen($_POST[$param])<=0){
$available = false;
$missingparams = $missingparams . ", " . $param;
}
}
// Hvis der mangler parametre.
if(!$available){
$response = array();
$response['error'] = true;
$response['message'] = 'Parameters ' . substr($missingparams, 1, strlen($missingparams)) . ' missing';
// Fremviser fejl
echo json_encode($response);
// Dropper yderligere eksekveringer.
die();
}
}
// Et array som står for at vise svar.
$response = array();
// Hvis det er et API-kald
// Hvilket vil sige, at et "GET" parametre ved navn: "apicall" er placeret i URL'en.
// Og med den parametre, kan vi konkludere, at der er tale om et API-kald.
if(isset($_GET['apicall'])){
switch($_GET['apicall']){
//opretbog operationen
// Hvis API-kald værdien er: "opretbog".
// Så vil vi oprette bogen i databasen.
case 'opretbog':
// Vi tjekker først om parametrene for forespørgslen er tilgængelige eller ej.
isTheseParametersAvailable(array('Titel', 'Beskrivelse', 'ISBN', 'Forfatter', 'Genre', 'Sprog'));
// Opretter et nyt DbOperation objekt
$db = new DbOperation();
// Opretter en ny bog i databasen.
$result = $db->opretBog(
$_POST['Titel'],
$_POST['Beskrivelse'],
$_POST['ISBN'],
$_POST['Forfatter'],
$_POST['Genre'],
$_POST['Sprog']
);
// Når bogen bliver oprettet, får vi følgende svar: Bogen er tilføjet. Ellers får vi beskeden: Fejl.
if($result){
//Når bogen bliver tilføjet, er der ingen fejl.
$response['error'] = false;
// Her har vi en besked med indholdet: "Bogen er tilføjet".
$response['message'] = 'Bogen er tilføjet';
// Her bliver alle bøgerne fra databasen hentet, som svar.
$response['Bogen'] = $db->hentBog();
}else{
//Hvis bogen ikke bliver tilføjet, så har vi en fejl.
$response['error'] = true;
// Her har vi fejlbeskeden.
$response['message'] = 'Fejl';
}
break;
// Hent operationen:
// Hvis API-kaldet er hentbog.
case 'hentbog':
$db = new DbOperation();
$response['error'] = false;
$response['message'] = 'Fuldført';
$response['Bogen'] = $db->hentBog();
break;
// Opdater operationen:
// Hvis API-kaldet er opdaterBog.
case 'opdaterbog':
isTheseParametersAvailable(array('id','Titel','Beskrivelse', 'ISBN', 'Forfatter', 'Genre', 'Sprog'));
$db = new DbOperation();
$result = $db->opdaterBog(
$_POST['id'],
$_POST['Titel'],
$_POST['Beskrivelse'],
$_POST['ISBN'],
$_POST['Forfatter'],
$_POST['Genre'],
$_POST['Sprog']
);
if($result){
$response['error'] = false;
$response['message'] = 'Bogen er opdateret';
$response['Bogen'] = $db->hentBog();
}else{
$response['error'] = true;
$response['message'] = 'Fejl';
}
break;
// Slet operationen:
// Hvis API-kaldet er sletbog.
case 'sletbog':
// For Slet operationen skal vi anvende et GET parameter fra URL'en med det id, for det element som skal slettes.
if(isset($_GET['id'])){
$db = new DbOperation();
if($db->sletBog($_GET['id'])){
$response['error'] = false;
$response['message'] = 'Bogen er slettet';
$response['Bogen'] = $db->hentBog();
}else{
$response['error'] = true;
$response['message'] = 'Fejl';
}
}else{
$response['error'] = true;
$response['message'] = 'Intet at slette, venligst angiv et nyt id';
}
break;
}
}else{
// Hvis det ikke er et API-kald.
// Sender en besked med svaret: "ikke et gyldigt API kald".
$response['error'] = true;
$response['message'] = 'Ugyldigt API-kald';
}
// Viser svaret i JSON formatet.
echo json_encode($response);
我的DbOperation:
<?php
class DbOperation
{
// Sti til databaseforbindelsen.
private $con;
// Konstruktør klassen.
function __construct()
{
// Henter DbConnect.php filen.
require_once dirname(__FILE__) . '/DbConnect.php';
// Opretter et DbConnect objekt til at forbinde til databasen med.
$db = new DbConnect();
// Initialisere vores sti til databaseforbindelsen for denne klasse.
// Ved at kalde metoden: "connect" fra DbConnect klassen.
$this->con = $db->connect();
}
/*
* Opret operationen:
* Når denne metode bliver kaldt, så bliver der oprettet et nyt element i databasen.
*/
function opretBog($Titel, $Beskrivelse, $ISBN, $Forfatter, $Genre, $Sprog){
$stmt = $this->con->prepare("INSERT INTO Bog (Titel, Beskrivelse, ISBN, Forfatter, Genre, Sprog) VALUES (?, ?, ?, ?, ?, ?)");
$stmt->bind_param("ssssss", $Titel, $Beskrivelse, $ISBN, $Forfatter, $Genre, $Sprog);
if($stmt->execute())
return true;
return false;
}
/*
* Hent operationen:
* Når denne metode bliver kaldt, bliver alle de eksisterende elementer i databasen hentet.
*/
function hentBog(){
$stmt = $this->con->prepare("SELECT id, Titel, Beskrivelse, ISBN, Forfatter, Genre, Sprog FROM Bog");
$stmt->execute();
$stmt->bind_result($id, $Titel, $Beskrivelse, $ISBN, $Forfatter, $Genre, $Sprog);
$Boger = array();
while($stmt->fetch()){
$Bog = array();
$Bog['id'] = $id;
$Bog['Titel'] = $Titel;
$Bog['Beskrivelse'] = $Beskrivelse;
$Bog['ISBN'] = $ISBN;
$Bog['Forfatter'] = $Forfatter;
$Bog['Genre'] = $Genre;
$Bog['Sprog'] = $Sprog;
array_push($Boger, $Bog);
}
return $Boger;
}
/*
* Opdater operationen:
* Når denne metode bliver kaldt, bliver det element med det indtastede id, opdateret til nye værdier.
*/
function opdaterBog($id, $Titel, $Beskrivelse, $ISBN, $Forfatter, $Genre, $Sprog){
$stmt = $this->con->prepare("UPDATE Bog SET Titel = ?, Beskrivelse = ?, ISBN = ?, Forfatter = ?, Genre = ?, Sprog = ? WHERE id = ?");
$stmt->bind_param("ssssssi", $Titel, $Beskrivelse, $ISBN, $Forfatter, $Genre, $Sprog, $id);
if($stmt->execute())
return true;
return false;
}
/*
* Slet operationen:
* Når denne metode bliver kaldt, vil elementet med det indtastede id, blive slettet i databasen.
*/
function sletBog($id){
$stmt = $this->con->prepare("DELETE FROM Bog WHERE id = ? ");
$stmt->bind_param("i", $id);
if($stmt->execute())
return true;
return false;
}
}
希望你们可以帮助我,我是新手,我真的卡住了,我已经好几个小时了。
先谢谢,雅各布。
答案 0 :(得分:0)
来自php api的响应没有给出发送您遇到此问题的确切所需数据。尝试将log.d放在您从api调用获得的响应上,然后进行调试。
答案 1 :(得分:0)
感谢您的帮助。我哥哥解决了这个问题。我在api中犯了一个小错误。我写道:“Bogen”而不是“bog”。
来自API:
case 'hentbog':
$db = new DbOperation();
$response['error'] = false;
$response['message'] = 'Fuldført';
$response['**Bogen**'] = $db->hentBog();
来自MainActivity:
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
progressBar.setVisibility(GONE);
try {
JSONObject object = new JSONObject(s);
if (!object.getBoolean("error")) {
Toast.makeText(getApplicationContext(), object.getString("message"), Toast.LENGTH_SHORT).show();
opdaterBogList(object.getJSONArray("**bog**"));
}
} catch (JSONException e) {
e.printStackTrace();
}
}