Eigene App soll sich untereinander synchronisieren

  • Antworten:26
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 9

06.10.2013 20:43:47 via Website

Hallo,

ich habe Angefangen eine App zu erstellen. In dieser habe ich einige CheckBoxes und Textfelder, die App wird wenn sie mal so funktioniert wie ich möchte von 15 bis 20 Leuten genutzt.

Es sollte so sein, dass einer der Benutzer ein Kreuz in eine der CheckBoxes machen kann und sich dieses dann bei allen anderen synchronisiert. Ebenso sollte es mit den Textfeldern funktionieren, jemand schreibt etwas und dies überträgt sich dann auch zu den anderen.

Mein Problem ist, dass ich zwar schon auf verschiedenen Seiten dazu gesucht habe, aber nichts dergleichen gefunden habe. Meine Frage ist deshalb ob solch eine Funktion überhaupt möglich ist und wenn ja wie man diese erstellt.

Ich würde mich sehr über Hilfe von euch freuen und bedanke mich schonmal im Vorraus über eure Antworten. :bashful:
  • Forum-Beiträge: 1.793

06.10.2013 20:57:00 via Website

Das sollte recht einfach funktionieren: Du hostest (mietest) dir einen Server (z.B. GoogleAppEngine: kostenlos). Dort erstellst du ein Skript, welches die Daten a) annimmt und speichert und b) wieder ausliest.
Vor jedem Start verbindet sich die App mit dem Server, lädt die aktuellen Infos runter (Fall b). Tätigt ein User eine Eingabe, sendet die App die Daten an den Server (Fall a).
LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.212

06.10.2013 21:00:27 via App

Wenn die Geräte sich im selben Netzwerk befinden, dann wäre das TCP Protokoll geeignet.
Wenn die App aber auch mit mobielem Internet etc. pp. funktionieren soll wird es schon komplizierter.
Dann benötigst du irgend einen online Datenspeicher (Webserver) dem du dann die Daten übergibst und die andere App sich dann die Daten holen kann.
Ein direkter weg ist mir nicht bekannt.

LG Pascal //It's not a bug, it's a feature. :) ;)

  • Forum-Beiträge: 9

06.10.2013 21:14:10 via Website

Vielen Danke für die schnellen Antworten ;)
Ich dachte immer nur an einen direkten Weg, da habe ich an sowas garnicht gedacht.

Die Daten mit einem Server zu synchronisieren sollte nicht all zu schwer zu programmieren sein, oder ?
Dazu befinden sich hier dann bestimmt auch wieder einige Einträge die mir weiterhelfen könnten.
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.212

06.10.2013 21:26:43 via App

Also wenn du dich schon im programmierbuissness auskennst dann ist es nicht schwer.
Du solltest ein bisschen php können, für das speichern der Daten. über den httpclient kannst du dann per get/post die daten schicken.
Dann musst du dir überlegen was passiert wenn mehrere Benuzer die gleiche checkbox ankruzen und ob du sehen willst wer welche box angekreuzt hat.
wenn du den grundaufbau hast kannst du aber die obengenannten dinge ganz leicht zur app hinzufügen.

LG Pascal //It's not a bug, it's a feature. :) ;)

  • Forum-Beiträge: 9

06.10.2013 21:38:29 via Website

Auskennen tu ich mich jetzt nicht wirklich.....Ich habe mir zum App erstellen eben die nötigsten Dinge angeschaut und durchgelesen und auch relativ gut Verstanden. Deshalb denke ich wenn ich jetzt weiß wie man so etwas machen kann, werde ich mich auch hier reinarbeiten können
  • Forum-Beiträge: 9

06.10.2013 22:37:12 via Website

Um das nochmal für mich zu verdeutlichen, ich nehme mir einen Webspace und erstelle dort mit php ein Script welches die Daten meiner App aufnimmt und sie für die anderen wieder bereitstellt.

Dieses Script muss dann also so funktionieren, wenn jemand ein Kreuz setzt lädt die App dieses Kreuz hoch. Wenn nun ein andere User seine App aufmacht lädt diese automatisch das Kreuz runter und zeigt dieses an. Wenn nun dieser das Kreuz später wieder weg macht muss die App also das Kreuz aus dem Webspace löschen und wenn es ja dann wieder gelöscht ist, ist auch bei allen Usern das Kreuz wieder weg.

Soetwas muss ich doch erstellen, richtig ?
  • Forum-Beiträge: 1.793

06.10.2013 22:40:59 via App

Fast.
Sagen wir, es wird nichts hoch/runtergeladen.
Deine App macht ein Request an http://deine-seite.de/set.php?kreuz=true
um das Kreuz zu setzen. Alle anderen Apps machen ein Request an
http://deine-seite.de/get.php
und bekommen als Inhalt (Quelltext)
kreuz=true
das müssen sie dann auswerten.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

  • Forum-Beiträge: 9

06.10.2013 23:15:30 via Website

Okey, danke :)
Werde mich gleich Morgen mal heranwagen.
  • Forum-Beiträge: 9

08.10.2013 17:48:53 via Website

Also ich habe jetzt eine SQL Datenbank mit Tabelle erstelt. Die Tabelle hat etwas mehr als 70 Spalten, da ich auch soviele Checkboxes habe.

Nun stehe ich doch noch vor einem Problem, wie bekomme ich es hin das meine Checkbox, wenn sie z.B. angekreuzt ist eine 1 an meine Tabelle sendet? Oder eben eine 0 wenn sie nicht angekreuzt ist?

Ich habe die Suchfunktion hier benutzt wurde aber nicht fündig, kann vielleicht auch daran liegen, dass ich nicht wirklich wusste nach was ich suchen sollte.

Wäre über eine Antwort nochmals sehr dankbar :)
  • Forum-Beiträge: 82

08.10.2013 19:35:13 via Website

Mit dem hier rufst du eine Website von Android aus auf:
1public static String httpurlconnection(String reqUrl) {
2
3 try {
4 HttpURLConnection con = (HttpURLConnection) new URL(reqUrl).openConnection();
5
6 if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
7 return inputStreamToString(con.getInputStream());
8 } else {
9 return "error";
10 }
11
12 } catch (MalformedURLException e) {
13 return "error";
14 } catch (IOException e) {
15 return "error";
16 }
17
18 }


Jede Checkbox bekommt einen OnClickListener
1checkbox.setOnClickListener(new View.OnClickListener()
2 {
3 @Override
4 public void onClick(View v)
5 {
6 //TODO: Webrequest mit dem als Übergabe
7 boolean state = checkbox.checked();
8
9 }
10 })


Auf deiner Homepage kannst du mit
1$uebergabe = $_GET["deinButton"];
in PHP die Übergabeparameter abfragen, die an die Seite gesendet wurden.
z.B. deine-seite.de/index.php?deinButton=true


Und dann gibt es eine Seite deine-seite.de/auslesen.php, die liefert etwas in der Richtung: "true,true,false,true" oder so. Das empfängst du und und bekommst mit split(",") ein Aray mit allen Schaltern.
1String schalter[] = rueckgabe.split(",");
2boolean SchalterEins = schalter[0].equals("true");

— geändert am 08.10.2013 19:47:04

Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.212

08.10.2013 21:05:18 via App

Du musst jeder deiner Checkbox eine eindeutige ID vergeben und im php diese ID dann einer Spalte bzw einem eintrag in der Tabelle zuordnen.

@hans-peter:
Das mit dem Split ist zwar eine gute Idee aber bei mehr als 70 werten ist es komfortabler wenn man einen eigenen Parser dafür entwirft.

— geändert am 08.10.2013 21:07:28

LG Pascal //It's not a bug, it's a feature. :) ;)

  • Forum-Beiträge: 82

08.10.2013 21:21:43 via Website

@Pascal P.
Ich hab mich auch schon mal an einem eigenen Parser versucht. Aber das ist dann relativ schnell ausgeartet. War unübersichtlich, unflexibel und ist unter bestimmten Bedingungen abgestürzt. ...Und ich habe viel zu viel Arbeit rein gesteckt.
Ich würde es auch bei 70 Werten noch mit split machen...
Aber wenn es eine andere Möglichkeit sein soll, dann ist doch XML perfekt. Da braucht man nicht selbst was schreiben.
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.212

08.10.2013 21:27:55 via App

Das stimmt wiederum obwohl es unötig ist erst ein xml zu erstellen und es dann wieder zu parsen.
Somit ist die Split methode doch einfacher.

LG Pascal //It's not a bug, it's a feature. :) ;)

  • Forum-Beiträge: 9

09.10.2013 17:20:03 via Website

@ Rafael K.
danke für den Tipp, aber damit kann ich nicht genau das machen, was ich eigentlich machen wollte.

@ Hans-Peter
Ich bekomme gleich in der ersten Zeile um die Website aufzurufen ein Problem mit meiner URL.

1public static String httpurlconnection (String "huettchenapp1.ohost.de") {

Fehlermeldung:
Syntax error on token ""huettchenapp1.ohost.de"", invalid VariableDeclaratorId

Muss ich hier die URL irgendwie anders eingeben?
Habe es auch schon ohne "" versucht dann bekomm ich eine Fehlermeldung wegen den . . und das ganze in () Funktioniert auch nicht.
  • Forum-Beiträge: 82

09.10.2013 17:49:48 via Website

1String response = httpurlconnection("huettchenapp1.ohost.de");

Das ist eine Funktion. Die gehört direkt in die Klasse, nicht in eine andere Funkion rein. Auf gleicher Ebene wie OnCreate().

— geändert am 09.10.2013 17:54:30

  • Forum-Beiträge: 1.793

09.10.2013 20:33:28 via App

Bitte bedenke, dass eine Internetverbindung niemal, niemals, niemals im UI-Thread laufen darf!
Nimm stattdessen Thread, oder besser AsyncTask.
Wenn nicht, wird deine App mit einem Fehler abstürzen.
Ich habe dazu mal ein Tut geschrieben, vielleicht hilft es dir ja.(s. DevForum/Tut/[Tutorial]Download einer Webseite).
LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

  • Forum-Beiträge: 9

09.10.2013 22:14:14 via Website

Danke nochmal für die große Unterstützung :)

Hatte noch keine Zeit mich nochmal an meine App zu setzen...

Die Fehler sind noch drin, werde aber mal die Activity hier posten wenn ihr sie mal sehen möchtet:

1package com.example.huettchenapp2;
2
3
4
5import android.os.Bundle;
6import android.app.Activity;
7import android.content.Intent;
8import android.view.Menu;
9import android.view.View;
10import android.view.View.OnClickListener;
11import android.widget.Button;
12import java.io.BufferedReader;
13import java.io.IOException;
14import java.io.InputStreamReader;
15import java.net.HttpURLConnection;
16import java.net.URL;
17import java.net.URLEncoder;
18import android.net.http.*;
19
20public class MainActivity extends Activity {
21
22 @Override
23 protected void onCreate(Bundle savedInstanceState) {
24 super.onCreate(savedInstanceState);
25 setContentView(R.layout.activity_main);
26
27 Button button1 = (Button) findViewById(R.id.button1);
28 Button button2 = (Button) findViewById(R.id.button2);
29 Button button3 = (Button) findViewById(R.id.button3);
30 Button button4 = (Button) findViewById(R.id.button4);
31
32 button1.setOnClickListener(new OnClickListener() {
33
34 @Override
35 public void onClick(View v) {
36
37 Intent intent = new Intent (v.getContext(), SecondActivity.class);
38 startActivityForResult (intent, 0);
39 }});
40
41
42 button2.setOnClickListener(new OnClickListener() {
43
44 @Override
45 public void onClick(View v) {
46
47 Intent intent = new Intent (v.getContext(), ThirdActivity.class);
48 startActivityForResult (intent, 0);
49
50 }});
51
52 button3.setOnClickListener(new OnClickListener() {
53
54 @Override
55 public void onClick(View v) {
56
57 Intent intent = new Intent (v.getContext(), FourthActivity.class);
58 startActivityForResult (intent, 0);
59 }});
60
61 button4.setOnClickListener(new OnClickListener() {
62
63 @Override
64 public void onClick(View v) {
65
66 Intent intent = new Intent (v.getContext(), FifthActivity.class);
67 startActivityForResult (intent, 0);
68 }});
69
70
71 public static String httpurlconnection (String "huettchenapp1.ohost.de") {
72
73 try {
74 HttpURLConnection con = (HttpURLConnection) new URL("huettchenapp1.ohost.de").openConnection();
75
76 if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
77 return inputStreamToString(con.getInputStream());
78 } else {
79 return "error";
80 }
81
82 } catch (MalformedURLException e) {
83 return "error";
84 } catch (IOException e) {
85 return "error";
86 }
87
88 }
89 }
90
91
92
93 @Override
94 public boolean onCreateOptionsMenu(Menu menu) {
95 getMenuInflater().inflate(R.menu.main, menu);
96 return true;
97
98 }}

Die Funktionen der Buttons Funktionieren alle. Die Fehler sind nur von Zeile 71 bis 85, aber wie gesagt ich kam noch nicht dazu eure Ratschläge umzusetzen. Ich werde mir morgen noch das Tutorial von impior durchlesen und auf jedenfall nochmal Grundlagentutorials zu Java. Denn anscheinend habe ich mich doch noch nicht genug damit auseinander gesetzt.