Daten von SQL Code mit auslese - Daten eines QR Code Readers vergleichen und den gelesenen wert für 5 Tage nicht verfügbar machen

  • Antworten:8
Maximilian Möller
  • Forum-Beiträge: 9

29.05.2017, 13:09:01 via Website

Hallo,

meine App kann bis jetzt einen QR Code lesen und diesen in Form eines Toasts ausgeben.
Nun möchte ich den eingelesenen Wert mit Werten aus einer SQL Datenbank abgleichen. Noch dazu kommt, dass wenn ein Wert mit dem eingelesenen Wert übereinstimmt, soll er für den User die nächsten 5 Tage nicht mehr Verfügbar sein. Leider habe ich keine Ahnung wie ich dies machen soll, da die UserDaten und der Value für den QR Code in zwei verschiedenen SQL Tabellen laufen.
Anbei mein Code:

private ZXingScannerView mScannerView;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_QR_READER
);
new GetContacts().execute();


ImageButton test = (ImageButton) findViewById(R.id.testforsql);
test.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mScannerView = new ZXingScannerView(QR_READER.this);
        setContentView(mScannerView);
        mScannerView.setResultHandler(QR_READER.this);
        mScannerView.startCamera();

    }

        Override
            public void handleResult(Result result) {
            Log.w("handleResult", result.getText());
            AlertDialog.Builder builder = new AlertDialog.Builder(QR_READER.this);
            builder.setTitle("Scan Result");
            builder.setMessage(result.getText());
            AlertDialog alertDialog = builder.create();
            alertDialog.show();
            qr_result = result.getText();
            Toast.makeText(getApplicationContext, qr_result, Toast.LENGTH_LONG).show();
            mScannerView.resumeCameraPreview(QR_READER.this);

}

private class GetContacts extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
    super.onPreExecute();
    // Showing progress dialog
    pDialog = new ProgressDialog(QR_READER.this);
    pDialog.setMessage("Please wait...");
    pDialog.setCancelable(false);
    pDialog.show();

}

@Override
protected Void doInBackground(Void... arg0) {
    HttpHandler sh = new HttpHandler();

    // Making a request to url and getting response
    String jsonStr = sh.makeServiceCall(url);

    Log.e(TAG, "Response from url: " + jsonStr);

    if (jsonStr != null) {
        try {
            JSONArray contacts = new JSONArray(jsonStr);

            // Getting JSON Array node


            // looping through All Contacts
            for (int i = 0; i < contacts.length(); i++) {
                JSONObject c = contacts.getJSONObject(i);


                String qr = c.getString("qr");
                HashMap<String, String> contact = new HashMap<>();

                // adding each child node to HashMap key => value

                contact.put("qr",qr);
                // adding contact to contact list
                contactList.add(contact);

            }
        } catch (final JSONException e) {
            Log.e(TAG, "Json parsing error: " + e.getMessage());
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(),
                            "Json parsing error: " + e.getMessage(),
                            Toast.LENGTH_LONG)
                            .show();
                }
            });

        }
    } else {
        Log.e(TAG, "Couldn't get json from server.");
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(),
                        "Couldn't get json from server. Check LogCat for possible errors!",
                        Toast.LENGTH_LONG)
                        .show();
            }
        });

    }

    return null;
}

@Override
protected void onPostExecute(Void result) {
    super.onPostExecute(result);
    // Dismiss the progress dialog
    if (pDialog.isShowing())
        pDialog.dismiss();

    for (final HashMap<String, String> contact : contactList){
      contact.get("qr");
  }
    }
}

}

Antworten
swa00
  • Forum-Beiträge: 3.704

29.05.2017, 13:17:19 via Website

Hallo Maximilian,

in dem Falle würde ich hingehen , der Tabelle einen TimeStamp hinzufügen und
diesen beim Query validieren

Liebe Grüße - Stefan
[ App - Entwicklung ]

Pascal P.

Antworten
Maximilian Möller
  • Forum-Beiträge: 9

29.05.2017, 13:39:31 via Website

Hallo Swa00,

danke für deine Antwort :) Aber wie soll ich das machen, weil die Userdaten und die QR Code daten in zwei verschiedenen Tabellen laufen, dass heisst es gibt bis jetzt noch keine Berührungspunkt.

Antworten
swa00
  • Forum-Beiträge: 3.704

29.05.2017, 13:50:56 via Website

Entweder baust du dir einen "Query - View" , damit kannst du Tabellen-Übergreiffend einen Cursor ermitteln,
https://dev.mysql.com/doc/refman/5.7/en/create-view.html

oder du machst zwei Ergebnisarrays und vergleichst sie zu Fuss

— geändert am 29.05.2017, 14:40:17

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Maximilian Möller
  • Forum-Beiträge: 9

29.05.2017, 15:00:00 via Website

Hey Swa00,

sorry aber so tief bin ich noch nicht in Android. Ist so etwas kompliziert zu entwickeln? Was würdest du empfehlen?

Antworten
Maximilian Möller
  • Forum-Beiträge: 9

29.05.2017, 16:16:33 via Website

Würde es nicht funktionieren, wenn ich den Value, der gerade verglichen wurde für den Zeitraum lokal speichere und nach einer gewissen zeit wieder lösche?

Antworten
swa00
  • Forum-Beiträge: 3.704

29.05.2017, 16:37:27 via Website

Maximilian, deine Frage bezieht sich aber weniger auf Android.

So wie ich das sehe, erhälst du die Daten via HTTP-Request aus einer MySql Datenbank von einem Server.
Und da musst du deinen View basteln, nicht in der App.

Deshalb hast du von mir auch den Link für die MySql bekommen

Innerhalb Android kannst du natürlich auch lokal eine SQlite verwenden

— geändert am 29.05.2017, 16:37:53

Liebe Grüße - Stefan
[ App - Entwicklung ]

Maximilian Möller

Antworten
Maximilian Möller
  • Forum-Beiträge: 9

29.05.2017, 16:40:42 via Website

OK danke Swa00, ich werde es zuerst auf lokaler Ebene versuchen, werde mich dann zurückmelden.

Antworten
Soulful
  • Forum-Beiträge: 4

31.05.2017, 10:42:27 via Website

Probier es doch ganz einfach auf Datenbank-Ebene. Ist meines erachtens einfacher. Erstelle einfach eine Relation zwischen Userdaten und QR-Code Daten die folgendermaßen aussieht: Aufgerufen(Primärschlüssel_von_Nutzer, Primärschlüssel_von_QRDaten, timestamp). Dort trägst du halt immer die Nutzer-ID und die QR-ID (oder was auch immer der Primärschlüssel ist) und den Timestamp zum Zeitpunkt zu dem der Nutzer den QR Code gescannt hat rein. Beim kontrollieren joinst du einfach alle drei Tabellen und selektierst nach NutzerID und QRID und guckst, ob es überhaupt so eine Zeile gibt, oder wenn es eine gibt, überprüfst du ob der Timestamp älter als 5 Tage ist, oder wenn es mehrere Zeilen gibt, nimmst du den neuesten Timestamp und überprüfst ob der älter als 5 Tage ist.

— geändert am 31.05.2017, 10:42:54

Pascal P.

Antworten