Datumsevents speichern

  • Antworten:43
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 282

11.08.2014, 14:58:11 via Website

Hallo Leute :)

Ich will gerade selbst einen Kalendar implementieren. Der Kalendar soll nicht mit irgendeinem Konten (Google-Konto) verknüpft werden. Ich will auch Events zu einem bestimmten Zeitpunkt bzw. Zeitraum speichern. Und diese offline und online bereitstellen.

Nun zu meiner Frage was bieten sich für Möglichkeiten, diese Events zu speichern?

LG Jakob

LG Jakob

Antworten
  • Forum-Beiträge: 26

13.08.2014, 01:35:06 via Website

Hey,

ich würde dir SQLite empfehlen. Das ist eine Datenbank in Android. Es gibt tausende Tutorials dazu im Netz, einfach mal suchen: "Android SQLite Tutorial (deutsch)".

Damit kannst du deine Termine perfekt abspeichern, sie bleiben bestehen, auch wenn du das Gerät ausschaltest oder die App beendest. Ebenfalls kannst du mit dem Update/Delete-Befehl Termine wunderbar bearbeiten/löschen.

Eine mögliche Struktur könnte wie folgt aussehen:

id | name des termins | inhalt des termins | zeitpunkt |

Die id ist immer eindeutig, so kannst du auch Termine bearbeiten, die eventuell an einem Tag sind.

Ich hoffe, das hilft dir weiter.

Grüße von

Stirnraten auf AndroidPit

PS: Nicht, dass ich dich falsch verstehe, um eine Dateobjekt zu erstellen, liefert Java eine Date-Klasse mit. In SQLite kannst du dann ein Zeitobjekt abspeichern.

Antworten
  • Forum-Beiträge: 282

01.09.2014, 19:40:41 via Website

Habe nun nach diesem Tutorial, eine Kalendar-View implementiert. Hier werden die Items nur als String in einer Liste gespeichert. Nun weiß ich nicht an welcher Stelle ich am besten die Items laden soll (Adapter oder in der View) und wie ich sie wirklich abspeichern soll.

Anmerkung: Ich möchte später, ein Event/Item einer bestimmten Kategorie zu weisen.

Jemand eine Idee?

LG Jakob

Antworten
  • Forum-Beiträge: 11.135

01.09.2014, 20:26:12 via Website

Wenn du einen extra zugeschnittenen Adapter dafür hast, dann ist es sinvoll es dort zu laden und zu speichern.
Wie schon gesagt wurde, ist hier eine DB angebracht.
Da kannst du dann deine Spalten für Kategorien anlegen etc.
Somit sind die Daten ordenlich gespeichert.

Was meinst du online und/oder offline?
Sollen die Daten aus der DB auch noch synchronisiert werden?
Dann könnest du ne online DB mit PHP und MySql nutzen, mit der dann die locale DB abgeglichen wird.

PS: das mit den Strings ist jetzt zwar nicht schön, aber du kannst das Datum etc. in ihre verscheidenen Objekte speichern oder gleich nur eine String DB machen.
Damit lässt sich halt nix anfangen, wenn du mit den Daten rechnen willst, zb. Zeit/Tage bis zum eingetragenen Termin.

PPS: offtopic: Ist die Mehrzahl von Datum wirklich Daten?

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

Antworten
  • Forum-Beiträge: 282

01.09.2014, 20:52:13 via Website

[[cite Pascal P.]]
...
PPS: offtopic: Ist die Mehrzahl von Datum wirklich Daten?

Denke schon ;)

Nun dass werde ich irgendiwe hinbekommen. Die Frage ist nur ob ich das auslesen der lokalen DB in einem AsyncTask oder ähnlichen machen soll, und dann erst später reinladen soll.

Eine weitere Frage: Es gibt dieses Layout, wie ein so ein Calendar-Item aussieht.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="60px" 
  android:padding="8dp"
  android:orientation="vertical"
  android:background="@drawable/list_item_background" >

     <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:textStyle="bold"
        android:textColor="@color/text_color" >
     </TextView>

     <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/date_icon"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/icon"
        android:visibility="invisible"/>
 </LinearLayout>

Ich möchte jetzt dann später jedoch für jede Kategorie eine eigene Farbe anzeigen (so wie im Kalendar von ColorNote (wenn die App jemand kennt)). Wenn ein Tag jetzt zum Bsp 3 Items hat, von unterschiedlichen Kategoreien. Jede Kategorie hat eine bestimmte Farbe und es soll dann ein kleines Icon nebeneinander und wenn es sich nicht mehr ausgeht untereinander. Damit es nicht zu viele werden soll dann irgendwann statt dem letzten Icon, ein Icon mit Punkte angezeigt werden. Die Frage ist nur mit welchem Layout sich dass realisieren lasst und ob es vielleicht besser is, die ImageViews mit den einzelnen Kategorien fix in XML zu kodieren und dann nur die Visibility zu setzen.

LG Jakob

Antworten
  • Forum-Beiträge: 11.135

01.09.2014, 21:26:43 via Website

Ich würde die maximale Anzahl die zu festlegst in die XML kodieren, und dann im Programm überprüfen, wieviele es in wirklichkeit sind.
Übersteigt die Anzahl deinen festgelegten Wert, wird das Bild der Letzen ImageView zu den 3 Punkten geändert.
Falls es zu wenig sind wird die Sichtbarkeit verändert.

Das ist aber umständlich, du kannst dich entscheiden ob du das fest in die XML Kodierst oder im Code Dynamisch ImageViews erstellst und in diese dann nach belieben ein Bild setzt.

Für die DB.

Ob man bei einer Localen DB nen AsyncTask benötigt weiss ich nicht.
Wenn ja, einer Mit callback und alles wird angezeigt wenns fertig geladen ist.

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

Antworten
  • Forum-Beiträge: 282

01.09.2014, 21:51:12 via Website

Welches Layout würde sich da am besten eignen für die ImageViews.

Was mein Problem auch gerade ist, dass sich die Item-Größe von der ImageView abhängt, hätte gerne eine fixe Größe... Aber leider bekomme ich dass nicht so hin, wie ich es gerne hätte.

LG Jakob

Antworten
  • Forum-Beiträge: 11.135

01.09.2014, 22:08:49 via Website

Keine Ahnung, du müsstest die Größe eines Items im Grid fest Kodieren, und danach dann schauen wie groß die ImageView sein muss.
Aber achtung: Denke an die Unterschiedlichen Displaygrößen der Geräte.
Nur Prozentuale Werte (weight) benutzen.

— geändert am 01.09.2014, 22:09:00

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

Antworten
  • Forum-Beiträge: 282

01.09.2014, 22:13:20 via Website

Darf ich die height nicht verändern?

Zurzeit ärgere ich mich noch mit dem Adapter ...

LG Jakob

Antworten
  • Forum-Beiträge: 11.135

01.09.2014, 22:16:52 via Website

Doch aber wenn du es falsch machst, dann sieht es auf anderen Geräten auch anders aus, und das will man meistens Vermeiden.

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

Antworten
  • Forum-Beiträge: 282

01.09.2014, 22:28:55 via Website

Okay Danke :)

Weißt du woran es liegen kann, wenn "plötzlich" (habe keine ahnung was ich geändert habe) dass bei der GridView beim OnItemClickListener, der Click sozusagen nur auf die Row passiert, sprich es wird immer das Item der ersten Spalte gewählt.

LG Jakob

Antworten
  • Forum-Beiträge: 11.135

01.09.2014, 22:41:24 via Website

Nein leider nicht, stell coh den alten zustand wieder her oder vergleiche dienen Code mit dem tut/oder einer Vorherigen Version.

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

Antworten
  • Forum-Beiträge: 282

01.09.2014, 22:45:06 via Website

Hmm ... Wollte meinen Adapter erweitern, damit er auch die Tage vom vorigen und nächsten Monat darstellt, halt in einer anderen Farbe. Leider bin ich gescheitert! Für heute ist mal Schluss ... :)

LG Jakob

Antworten
  • Forum-Beiträge: 282

04.09.2014, 19:36:49 via App

Pascal P.

Keine Ahnung, du müsstest die Größe eines Items im Grid fest Kodieren, und danach dann schauen wie groß die ImageView sein muss.

Wie genau hast du das gemeint?

LG Jakob

Antworten
  • Forum-Beiträge: 11.135

04.09.2014, 20:06:04 via App

Also die Grid Kalender Items müssen eine Feste größe haben damit diese sich beim hinzufügen von Images nicht verändern.
Dann musst du nur noch schauen wieviele Bilder du da unterbekommst.

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

Antworten
  • Forum-Beiträge: 282

04.09.2014, 20:51:34 via Website

Wie kann ich ihnen eine feste Größe geben?

LG Jakob

Antworten
  • Forum-Beiträge: 282

04.09.2014, 21:26:42 via Website

Danke :)

Sollte ich die Events gleich beim initalisieren des CalendarAdapter-Objektes laden? Gleich alle? Und nicht immer jedes Monat einzeln laden?

LG Jakob

Antworten
  • Forum-Beiträge: 11.135

04.09.2014, 21:39:03 via Website

Ne ich würde immer nur die für einen Monat laden.
Sonst verbrauchst du unötig Ressourcen.
Kannst ja für den 2. Monat noch laden so dass du immer 1 nen Monat puffer hast.
Wenn halt der nächste Monat aufgerufen wird, lädst du im Hintergrund den übernächten nach.

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

Antworten
  • Forum-Beiträge: 282

04.09.2014, 22:17:43 via App

Hm gute Idee!

Ich habe gerade in einem LinearLayout für Testzwecke ein paar ImageViews rein. Leider "rennen" die mir rechts hinaus, bzw. verschwinden weil man sie ja dann nicht mehr sieht. Wie kann man da einen Zeilenumbruch machen? Muss ich dazu die Breite des LinearLayouts setzen?

LG Jakob

Antworten
  • Forum-Beiträge: 11.135

04.09.2014, 22:33:42 via Website

Entweder das oder du sagst, dass sich die ImageViews untereinander anordnen sollen.
Aber frag mich jetzt nicht wie das geht.
Da bin ich überfragt.
In der XMK wüsste ichs aber nicht per Code.

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

Antworten
  • Forum-Beiträge: 282

05.09.2014, 15:58:06 via Website

Gibts keine andere Möglichkeit, als dass so fix zu kodieren?

LG Jakob

Antworten
  • Forum-Beiträge: 11.135

05.09.2014, 16:02:34 via Website

Ja per code geht das auch aber da soltest du google fragen und nicht micht.

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

Antworten
  • Forum-Beiträge: 282

09.09.2014, 21:13:40 via Website

So habe jetzt einmal dass ganze sohalbwegs offline realisiert.

Die Frage die ich mir jetzt frage ist, zu welchen Zeitpunkten ich meine Sqlite mit meiner Mysql-DB synchronisiere.

über GCM? und immer die neuen Events auch gleich online inserten? Muss ich irgendwelche Spalten machen um zu schauen ob sie schon synchronisiert wurde?

LG Jakob

Antworten
  • Forum-Beiträge: 11.135

09.09.2014, 21:18:48 via Website

Eigentlich nicht ich würde es so in etwa machen:
http://programmerguru.com/android-tutorial/how-to-sync-sqlite-on-android-to-mysql-db/

Vieleicht noch ein Synchronisierungs Konzept erstellen, sodass du weisst wann du synchronisieren musst.
Ich würde es beim öffnen und schließen machen.
Und im Hintergrund nicht vergessen.

LG Pascal

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

Antworten
  • Forum-Beiträge: 282

09.09.2014, 21:25:03 via Website

Du würdest beim öffnen von Mysql einlesen? Ich fürchte, dass es dann zu einer zu langen pause kommt, in dieser keine Items angezeigt werden.

LG Jakob

Antworten
  • Forum-Beiträge: 11.135

09.09.2014, 21:27:16 via Website

Da hast du wohl recht.
Ich würde das nur einlesen, wenn die Daten auf dem Device älter sind als in der online DB.
Und da wären wir wieder bei Timestamps :)
Eine Spalte in der db für das Datum und die Zeit des letzen Updates sollten genügen.

— geändert am 09.09.2014, 21:27:26

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

Antworten
  • Forum-Beiträge: 11.135

09.09.2014, 21:30:56 via Website

In beidem wäre sinnvoll.
Da hast du dann die möglichkeit die App mit den gleichen Daten auf unterschiedlichen Geräten zu nutzen.

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

Antworten
  • Forum-Beiträge: 282

09.09.2014, 21:35:32 via Website

Stimmt danke! :)

Hättest du vielleicht auch noch eine Idee. Ich will mehrer Kategorien machen, sprich z.B.: Schule, Privat, Gemeinsam ... dass jedem Event eine so eine Kategorie zugewiesen wird. Weiß jedoch noch nicht wie ich es am besten abspeichere. Habe daweil nur eine Kategorie hardcodiert.

LG Jakob

Antworten
  • Forum-Beiträge: 11.135

09.09.2014, 21:42:54 via Website

Na ja das ist nicht vorteilhaft.

mir fallen da 2 Möglichkeiten ein:
1. Du erstellst eine Enumeration mit allen Kategorien, hast dann in beiden DBs ein Kategorie Feld und speichert entweder die ID oder den String Namen der jeweiligen Enumeration.
Beim einlesen musst du diese dann nur parsen.

  1. Lösung ohne Enumeration, da kannst entweder Strings verteilen und diese dann per ifs die Kategorie zuordnen oder eine Integer vergeben und per switch die Kategorie zuordnen.

Ich persönlich bevorzuge die 1. Variant, diese ist wesentlich einfach und verständlicher als die 2.
Ob man für die Kategorie jetzt Integer oder Strings nimmt ist eigentlich egal, außser wenn man wert auf "Menschenlesbarkeit" der DB legt.
(Damit man nicht immer die Keategorie bedeutung der ID nachschauen muss)

Lg Pascal

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

Antworten
  • Forum-Beiträge: 282

09.09.2014, 22:01:49 via Website

Werde es in den nächsten Tagen einmal mit Enums probieren :) Danke!

LG Jakob

Antworten
  • Forum-Beiträge: 282

03.12.2014, 22:08:59 via App

Hallo :)
Ich möchte nun die Funktionalität erweitern und zwar soll eine Notificatiom unabhängig vom Starten der App angezeigt werden, ob am heutigen Tag Events stattfinden.

Wie kann ich dies machen?

LG Jakob

LG Jakob

Antworten
  • Forum-Beiträge: 11.135

03.12.2014, 22:10:58 via App

Das kannst du über GCM und php machen. Also jeden morgen die DB auf Events prüfen und je nachdem eine GCM nachricht senden.

LG

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

Antworten
  • Forum-Beiträge: 282

03.12.2014, 22:19:34 via App

Ich habe aber auch Events die nur lokal gespeichert sind.

LG

LG Jakob

Antworten
  • Forum-Beiträge: 11.135

03.12.2014, 23:16:39 via App

Das sollte dann über einen Service und oder einem AlarmManager Funktioniere n.

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

Antworten
  • Forum-Beiträge: 282

12.12.2014, 10:48:51 via Website

Wie kann man das implementieren mit einem Service? oder ist der AlarmManager eine bessere Lösung?

LG Jakob

Antworten
  • Forum-Beiträge: 11.135

12.12.2014, 19:08:00 via App

Na ja über einen Service müsstest du einen Timer aufrufen der die onTick abrufen ob die aktuelle Zeit morgends ist. Also ist der Alarmmanager die bessere einfacher und akkusparendere Lösung.

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

Antworten
  • Forum-Beiträge: 282

14.12.2014, 22:35:11 via App

Und den AlarmManager dan über ein BroadcastReceiver starten?

LG Jakob

Antworten
  • Forum-Beiträge: 434

14.12.2014, 23:23:49 via Website

Hmm, das macht ja nicht viel Sinn.. den Alarm startest du am besten aus einer Activity und der wiederum startet dann die Logik, die du ausführen willst...
Bzw. ein Broadcast Receiver kann auch einen Alarmstarten (zB wenn du nach dem Booten etwas starten willst, bekommt dein BR das "frisch hochgefahrene System" mit und startet dann den Alarm um X Uhr oder in X-Stunden...
Dafür gibts einige Tuts im Netz... musst dir nur die Mühe machen und die sorgfältig durcharbeiten. ;)

Open Source

Antworten
  • Forum-Beiträge: 282

15.12.2014, 18:16:38 via Website

Könntest du mir vielleicht noch sagen nach was ich geanu googeln muss. Danke!

LG Jakob

LG Jakob

Antworten