0

MySQL と Java (Android 上で) を使用して WAMS サーバーのデータベースにアクセスし、そこから情報を取得しようとしています。私のアプリのセットアップ方法は、ログインしているユーザー名の「uid」を(別のテーブルから)取得して保存する初期ログイン画面があることです。

ログインすると(これは機能します-取得したユーザー名とログインしているユーザーのuidを表示するトースト通知をセットアップします)、取得したデータを表示するためのTextViewフィールドがセットアップされた新しい画面(dashboard.xml)に移動します(から以下に掲載されている表) は、保存された「uid」に関連付けられています。データを取得しようとしているテーブルは次のとおりです。

http://db.tt/4izVQuGB

これで、特定の「uid」に関連付けられた行をデータベースに照会する PHP ファイルをセットアップしました。HTML フォームを使用してこのファイルをテストしました。

$connect = mysql_connect($dbhost, $dbuser, $dbpass) or die("connection error");
mysql_select_db($dbdb)or die("database selection error");

//Retrieve the User ID
$uid = $_POST['uid'];

//Query
$query = mysql_query("SELECT * FROM node WHERE uid='$uid' AND type='goal'");

//store # of rows returned
$num_rows = mysql_num_rows($query);

if ($num_rows >= 1) {
    while($results=mysql_fetch_assoc($query)) {
        //Store the returned data into a variable
        $output = $results;

        //encode the returned data in JSON format
        echo json_encode($output);
    }
    mysql_close();
}

uid 値 1 を使用して PHP ファイルをテストした結果は次のとおりです。

{"nid":"1","vid":"1","type":"goal","language":"","title":"test","uid":"1","status ":"1","作成":"1342894493","変更":"1342894493","コメント":"2","昇格":"1","モデレート":"0","スティッキー": "1","tnid":"0","翻訳":"0"}

{"nid":"2","vid":"2","type":"goal","language":"","title":"test2","uid":"1","status ":"1","作成":"1342894529","変更":"1342894529","コメント":"2","昇格":"1","モデレート":"0","スティッキー": "1","tnid":"0","翻訳":"0"}

{"nid":"5","vid":"5","type":"goal","language":"","title":"run","uid":"1","status ":"1","作成":"1343506987","変更":"1343506987","コメント":"2","昇格":"1","モデレート":"0","スティッキー": "1","tnid":"0","翻訳":"0"}

{"nid":"9","vid":"9","type":"goal","language":"","title":"丘まで走る","uid":"1" ,"ステータス":"1","作成":"1343604338","変更":"1343605100","コメント":"2","昇格":"0","モデレート":"0"," sticky":"0","tnid":"0","translate":"0"}

これで、httppost をセットアップし、データベース テーブルの「タイトル」を取得することになっている Android コードをいくつか作成しました。私はそれが間違っていることを知っています(明らかに機能しないため)が、次に何をすべきかについて混乱しています.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class Dashboard extends Activity implements OnClickListener {

    // variable declarations
    String uid = "1";

    // create textview to display retrieved data
    TextView display;

    HttpClient httpclient;
    HttpPost httppost;
    HttpResponse httpresponse;
    HttpEntity httpentity;

    ArrayList<NameValuePair> resultArray;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dashboard);
        display = (TextView) findViewById(R.id.test);

        // initialize HttpClient
        httpclient = new DefaultHttpClient();

        // initialize HttpPost
        httppost = new HttpPost("http://192.168.1.112/android/fetch.php");

        try {
        // Create new List
        List<NameValuePair> resultList = new ArrayList<NameValuePair>();
        resultList.add(new BasicNameValuePair("uid", uid));

        httppost.setEntity(new UrlEncodedFormEntity(resultList));

        httpresponse = httpclient.execute(httppost);

        httpentity = httpresponse.getEntity();

        InputStream instream = entity.getContent();

        try {
                            // store incoming stream in an array
            JSONArray jArray = new JSONArray(streamToString(instream));
            JSONObject jData = null;

            for (int i = 0; i < jArray.length(); i++) {
                jData = jArray.getJSONObject(i);
                String goals = jData.getString("title");
                display.setText(goals);
            }
        //} catch (JSONException e) {
            //Toast.makeText(this, "No entries found", Toast.LENGTH_LONG).show();
        } catch (Exception e) {
            Toast.makeText(this, e.toString(), Toast.LENGTH_LONG)
                    .show();
        }

    } catch (Exception e) {
        e.printStackTrace();
        Notifications error = new Notifications();
        error.userPassErrorDialog();
    }

}

private static String streamToString(InputStream is) {

    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null;
    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return sb.toString();
}

public void onClick(View v) {
    // TODO Auto-generated method stub

}

}

Android エミュレーターでテストすると、次のエラーが発生します。

http://db.tt/2vg9MqYh

どんな助けや提案も大歓迎です。

4

2 に答える 2

0

問題は、JSON のエンコードとデコードにあります。JSON 応答から、サーバーから JSON オブジェクトを受信して​​いるように見えます。ここでJSON 応答を検証してみてください。ブラウザーで php ファイルを実行し、JSON バリデーターで応答全体をコピーして、応答を受信して​​いる括弧を確認します。

1. 応答が「[」で始まる場合は配列であり、「{」で始まる場合は JSON オブジェクトです。JSON の解析中に、最初に JSON 配列を定義しましたが、サーバーの応答は JSON オブジェクトです。JSON を使用している間は、サーバー側で送信する応答の形式に注意する必要があり、クライアント側で受信する応答の形式に注意する必要があります。サンプルスクリプトを投稿しています。

-> サーバー側

if (mysql_num_rows($result)>0){
$response["data"] = array();        //this is an array
while($row= mysql_fetch_array($result))
{
$data = array();      //here I have created another temp array
$data["name"] = $row["name"];         
$data["surname"] = $row["surname"];   

array_push($response["data"], $data);   //this makes an array of objects in the response
}}
}//endif
else{
echo "no input";
}}
mysql_close();
echo json_encode($response);    //and finally I echo it as an JSON object

このphpスクリプトは、オブジェクトの配列の1つのオブジェクトを返します(少し複雑ですよね!!)以下は応答の形式です

-> 検証済みの JSON レスポンス

{
    "data": [
        {
            "name": "Setu",
             "surname": "Desai",
        }
     ]
}

これをデコードするには、クライアント サイトのスクリプトを次のようにする必要があります。

-> JSON オブジェクトを解析中

JSONObject snObject = new JSONObject(jsonString);
    JSONArray snArray = snObject.getJSONArray("data");
    for (int i = 0; i < snArray.length(); i++) {
        JSONObject snObject2 = snArray.getJSONObject(i);
        String surname = snObject2.getString("surname");
        surnamearray.add(surname);
    }

理解する簡単な方法は、JSON 応答を検証し、JSON 配列とオブジェクトの位置を特定してから、デコードを開始することです。

于 2014-03-23T21:10:54.057 に答える
0

Android アプリでは、JSONArray が必要です。

// store incoming stream in an array
JSONArray jArray = new JSONArray(streamToString(instream));

ただし、PHP ファイルでは、実際の配列ではなく、複数の個別の JSON オブジェクトのみを出力します。データベースからすべてのアイテムを最初に PHP 配列に収集してから、一度だけエンコードして出力する必要があると思います。

私のPHPスキルは少し錆びていますが、これがうまくいくことを願っています:

//store # of rows returned
$num_rows = mysql_num_rows($query);

if ($num_rows >= 1) {
    $output = array();

    while($results = mysql_fetch_assoc($query)) {
        // append row to output
        $output[] = results
    }

    mysql_close();  // shouldn't that be outside the if block?

    //encode the returned data in JSON format
    echo json_encode($output);
}

出力は次のようになると思います(おそらくインデントなし):

[
    {"nid":"1","vid":"1","type":"goal","language":"","title":"test","uid":"1","status":"1","created":"1342894493","changed":"1342894493","comment":"2","promote":"1","moderate":"0","sticky":"1","tnid":"0","translate":"0"},
    {"nid":"2","vid":"2","type":"goal","language":"","title":"test2","uid":"1","status":"1","created":"1342894529","changed":"1342894529","comment":"2","promote":"1","moderate":"0","sticky":"1","tnid":"0","translate":"0"},
    {"nid":"5","vid":"5","type":"goal","language":"","title":"run","uid":"1","status":"1","created":"1343506987","changed":"1343506987","comment":"2","promote":"1","moderate":"0","sticky":"1","tnid":"0","translate":"0"},
    {"nid":"9","vid":"9","type":"goal","language":"","title":"run to the hills","uid":"1","status":"1","created":"1343604338","changed":"1343605100","comment":"2","promote":"0","moderate":"0","sticky":"0","tnid":"0","translate":"0"}
]
于 2012-08-04T15:01:10.843 に答える