rivaille-sama
rivaille-sama

Reputation: 103

Android - Display data from MySQL

I'm very new to Android and I'm currently making an application wherein the user can enter and ID number once (that serves as a login) and he can use access the rest of the features of the app.

I'm currently stuck in the displaying of a data from the MySQL server. Using the ID that the user entered (which is unique and only the user's identificaton), I can display the information with of the user (through TextView or something).

This is my code so far:

    public class MainActivity3Activity extends Activity {


   HttpPost httppost;
   StringBuffer buffer;
   HttpResponse response;
   HttpClient httpclient;
   List<NameValuePair> nameValuePairs;
   ProgressDialog dialog = null;
    TextView tv;
    TextView tv2;
    String get;

private WebView webView;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_activity3);

    tv = (TextView)findViewById(R.id.tv);
    tv2 = (TextView)findViewById(R.id.tv2);

    webView = (WebView) findViewById(R.id.webView);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.loadUrl("http://usamobileapp.pe.hu/webservice/student_info.php");

    SharedPreferences preferences = getSharedPreferences("rfid", Context.MODE_PRIVATE);
    if(preferences.contains("rfid")){
        get = preferences.getString("rfid", null);
    }

}

So my question what do I do from here? I'm quite familiar about httpost but I'm wondering how do I display the user information using the previously entered ID during the login? I heard things like JSON parsing but I'm not quite sure on how to use it.

How do I get to display the information of the user matching the ID he entered? How to diplay using a TextView?

Thanks for the help.

PS. Please disregard the webview there. I only used it as a sample if my app really us connected to my php.

Upvotes: 0

Views: 908

Answers (3)

Manos
Manos

Reputation: 1501

To implement a login / registration system using MySql you need a server-side API, for example in PHP to manipulate the database.

You need something like that on the server side:

// check for tag type
if ($tag == 'login') {
    // Request type is check Login
    $email = $_POST['email'];
    $password = $_POST['password'];

    // check for user
    $user = $db->getUserByEmailAndPassword($email, $password);
    if ($user != false) {
        // user found
        $response["error"] = FALSE;
        $response["uid"] = $user["unique_id"];
        $response["user"]["name"] = $user["name"];
        $response["user"]["email"] = $user["email"];
        $response["user"]["created_at"] = $user["created_at"];
        $response["user"]["updated_at"] = $user["updated_at"];
        echo json_encode($response);
    } else {
        // user not found
        // echo json with error = 1
        $response["error"] = TRUE;
        $response["error_msg"] = "Incorrect email or password!";
        echo json_encode($response);
    }

And the function that queries the database:

public function getUserByEmailAndPassword($username, $password) {
    $query = $this->dbh->prepare("SELECT * FROM users2 WHERE username = :username");
    $query->bindParam(':username', $username);
    $result = $query->execute();
    // check for results
    if ($query->rowCount() > 0) {
        $result = $query->fetch(PDO::FETCH_ASSOC);
        $salt = $result['salt'];
        $encrypted_password = $result['encrypted_password'];
        $hash = $this->checkhashSSHA($salt, $password); 
        // check for password equality
        if ($encrypted_password == $hash) {
            // user authentication details are correct
            return $result;
        }
    } else {
        // user not found
        return false;
    }
}

The android 'calls' the php scripts:

private static String login_tag = "login";
public void loginUser(String username, String password) throws ExecutionException, InterruptedException {
    // Building Parameters
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("tag", login_tag));
    params.add(new BasicNameValuePair("username", username));
    params.add(new BasicNameValuePair("password", password));
    jsonParser = new DbHandler(activity, this, params).execute();
}

And here is the DbHandler:

  public DbHandler1(Activity activity, MyCallback dbIntf, List<NameValuePair> params) {
        this.activity = activity;
        intf = dbIntf;
        this.params = params;
    }


    public JSONObject makeHttpRequest() {
        // Making HTTP request
        try {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(MainActivity.baseUrl);
            //If database contains greek characters instantiate with UTF-8 Encoding
            httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        } catch (HttpHostConnectException e) {
            new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(activity, R.string.connection_error, Toast.LENGTH_LONG).show();
                }
            });

        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            //If database contains greek characters instantiate with UTF-8 Encoding
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "UTF-8"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();

        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;
    }


    @Override
    protected JSONObject doInBackground(Void... params) {
        jObj = makeHttpRequest();
        return jObj;
    }

    @Override
    protected void onPostExecute(JSONObject jsonObject) {
        super.onPostExecute(jsonObject);
        try {
            intf.onRemoteCallComplete(jsonObject);
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

So the php scripts 'catches' the tag and if the user exists it returns a JSON response to the device. For example:

{
    "tag": "login",
    "success": 1,
    "error": 0,
}

The data transfered from the MySql server must be JSON encoded.

On the android device you must read the JSON Response and act accordingly.

Take a look here for more details.

Upvotes: 1

gadfil
gadfil

Reputation: 417

you need perform network operations on a separate thread from the UI. reade aboute rest Google I/O 2010 - Developing Android REST client application
documentation
in the client, for rest api i like use retrofit + gsongroundy
or php, very easy create rest api using slim frameworkHow to create REST API for Android app using PHP, Slim and MySQL

Upvotes: 0

user3473590
user3473590

Reputation:

1) make a restful API on your server

2) receive API elements on your client (android), i suggest retrofit, its too easy

3) display your data! otto will help :)

want more? more ,

it might seem hard, but if you study for a few days you'll learn it.

Upvotes: 1

Related Questions