Eigene App soll sich untereinander synchronisieren

  • Antworten:26
Tobias
  • 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:

Antworten
impjor
  • 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!

Tobias

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

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. :) ;)

Tobiasimpjor

Antworten
Tobias
  • 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.

impjor

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

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. :) ;)

Tobias

Antworten
Tobias
  • 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

Antworten
Tobias
  • 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 ?

Antworten
impjor
  • 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!

Antworten
Tobias
  • Forum-Beiträge: 9

06.10.2013, 23:15:30 via Website

Okey, danke :)
Werde mich gleich Morgen mal heranwagen.

Antworten
Tobias
  • 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 :)

Antworten
Gelöschter Account
  • 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

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

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. :) ;)

Antworten
Gelöschter Account
  • 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.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

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. :) ;)

Antworten
Tobias
  • 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.

Antworten
Gelöschter Account
  • 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

Antworten
impjor
  • 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!

Gelöschter Account

Antworten
Gelöschter Account
  • Forum-Beiträge: 82

09.10.2013, 20:58:16 via Website

@impjor:
Danke, stimmt. Guter Einwand.

Antworten
Tobias
  • 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.

Antworten
impjor
  • Forum-Beiträge: 1.793

10.10.2013, 13:39:44 via App

Die Grundlagen zu Java sind wirklich enorm wichtig.
Warum ist deine Funktion statisch? Zudem ist die Parameterliste falsch.
LG

Liebe Grüße impjor.

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

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

10.10.2013, 13:55:48 via Website

Tobias
@ Rafael K.
danke für den Tipp, aber damit kann ich nicht genau das machen, was ich eigentlich machen wollte.
Weil? Das was du im ersten Post beschrieben hast, kannst Du damit perfekt umsetzen.

Es sei denn es geht dir darum die Prinzipien dahinter durch learning-by-doing zu erlernen.
Andernfalls würde ich IMMER erst versuchen vorhandene Frameworks zu nutzen, sonst machst Du dir Arbeit, die andere schon längst geleistet haben, verschwendest Stunden mit Problemen, die andere schon gelöst haben. machst Fehler, die andere schon längst behoben haben, usw. usw.

Antworten
Lucas
  • Forum-Beiträge: 717

10.10.2013, 16:02:40 via App

Du kannst die auch einfach eine MySQL-Datenbank mieten, und von der App dann die Datenbank auslesen und reinspeichern

Antworten
Gelöschter Account
  • Forum-Beiträge: 82

10.10.2013, 16:28:28 via Website

impjor
Warum ist deine Funktion statisch?
Ich hatte sie in einer Klasse verbaut, die auch statisch aufgerufen wird. Hier her habe ich sie 1:1 kopiert. Also das static kann natürlich auch weg.

impjor
Zudem ist die Parameterliste falsch.
Warum ist die falsch? Bzw. welche Liste meinst du?

Antworten
Tobias
  • Forum-Beiträge: 9

10.10.2013, 16:33:49 via Website

@ impior
Die Funktion ist statisch weil ich das erste Beispiel von Hans-Peter so übernommen hatte mit public static.... .
Wie gesagt meine Grundlagen reichen doch noch nicht aus um eine App zu schreiben, werde mich wohl noch intensiver mit dem Thema beschäftigen müssen.

@ Rafael K.
Des einen wollte ich schon die Funktionen selber erstellen, des anderen weiß ich aber auch nicht wie ich mit Google Cloud Messaging meine Checkboxes synchronisieren kann. Ist doch ein Service der es mir erlaubt, dass es die Geräte anping wenn neue Daten auf einem Server vorhanden sind damit sie diese dann runterladen können. Aber damit kann ich doch nicht die Informationen von den Checkboxes auf einen Server hochladen und sie von den anderen Geräten wieder runterladen lassen, oder ?
Wenn doch habe ich die Funktionsweiße falsch verstanden und sollte mich damit auch auseinander setzen.

@ Lucas
Ich habe ja eine MySQL-Datenbank und möchte ja auch die Checkboxes in diese reinspeichern und wieder aus dieser abrufen. Das ist aber auch mein Problem das ich noch nicht genug Kenntnis habe um dies zu bewerkstelligen.

Antworten
impjor
  • Forum-Beiträge: 1.793

10.10.2013, 18:14:09 via Website


Zudem ist die Parameterliste falsch.
Warum ist die falsch? Bzw. welche Liste meinst du?

Diese
public static String httpurlconnection (String "huettchenapp1.ohost.de") {
Das ist der Anfang einer Funktion in Java. Da gibt es mehrere Bausteine:
public: Diese Funktion kann von allen anderen Klassen aufgerufen werden, nicht nur aus deiner.
static: Man kann MainActivity.httpurlconnection() aufrufen, und braucht nicht ein Objekt
String: Die Funktion gibt zuletzt einen String zurück
httpurlconnection: Name der Funktion
(): Da folgen jetzt Paramter/Argumente. Meint: Du kannst beim Aufruf Informationen mitgeben. Statt
1public static String httpurlconnection (String "huettchenapp1.ohost.de")
machst du
1public static String httpurlconnection (String adresse)
Nun kannst du in der Funktion, die "Information" adresse benutzen. Dann muss du aber beim Aufruf httpurlconnection("huettchenapp1.ohost.de"); verwenden.
So wie jetzt wird es nicht funktionieren.

LG

Liebe Grüße impjor.

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

Antworten
Gelöschter Account
  • Forum-Beiträge: 82

10.10.2013, 18:17:59 via Website

Ach so, klar. Ich dachte, du beziehst dich auf meinen Code am Anfang.

impjor

Antworten