Kleine "Datenbank"

  • Antworten:27
Rolf Hardt
  • Forum-Beiträge: 19

02.01.2013, 22:13:04 via Website

Hallo Leute,
ich bin neu hier aber das soll nichts entschuldigen und wahrscheinlich gibt es die Antwort zu meine Frage schon irgendwo im www.
Aber bevor ich den Googlefrust bekomme versuche ich es mal hier.

Ich hab mich mal an einer kleine APP versucht. Die APP dient zur Berechnung der erforderlichen Leistung für Drehmaschinen.
Habe bis dato nicht brauchbares im Market-Place gefunden.

Meine APP tut es nun auch nach dem Studium einiger tutorials und nach einigen trial&error versuchen.

Ok nun mein Problem.
Einer der Faktoren bei der Leistungsberechnung ist die spezifische Schnittkraft und diese wiederum ist Materialabhängig.
Also würde ich gern eine Materialauswahl in meiner APP integrieren.
Da es aber hunderte von Materialien gibt die wiederum gruppiert werden können wäre mein Lösungsansatz folgender.

Die Materialien in Excel gruppieren und dort auch weitere Eigenschaften definieren. (Excel kann selbst ich).
Nun meine Frage.....
Wie bekomme ich die Daten aus Excel in eine Java (bzw. xml)- Struktur gespeichert und wie kann ich auf diese dann von meiner APP aus zugreifen ?

Ich wäre für Anregungen, andere Lösungsvorschläge, kleine Programmierbeispiele sehr dankbar.

Gruß,
Rolf

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

02.01.2013, 22:26:04 via Website

Excel 2010 kann direkt als .xml speichern

ansonsten such mal bei Google nach csv2xml

Das sollte Dir weiterhelfen.

lg Voss

Antworten
Rolf Hardt
  • Forum-Beiträge: 19

02.01.2013, 22:39:33 via Website

Hallo Jörg,
vielen Dank erstmal. Ich werde es mal probieren. Wenn ich dann die Excel-Tabelle als xml Datei habe weiß ich zwar immer noch nicht so genau wie ich von der APP aus auf diese xml Datei zugreife. Bin ein ziemlicher Newbie...sorry.
Ich habe zwar viele Programmiersprachen hinter mir muß aber leider feststellen, dass das ganze trotz mehr Komforts nicht wirklich einfacher wird.

Da war mir Print "Hello World" noch am liebsten :-)

Naja, versuch macht kluch.


However danke erstmal.
Gruß,
Rolf

Antworten
Andy N.
  • Forum-Beiträge: 3.112

02.01.2013, 23:51:07 via App

xml würde ich nicht verwenden, nimm dann gleich csv.
Oder hast du Visual Studio. Dann lässt du dir recht schnell ein kleines Programm schreiben, dass dir die Daten in eine SQLite schreibt.

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

03.01.2013, 00:05:45 via Website

Wenn es sich um "hunderte" Materialien handelt, aus denen du in der App auswählen willst, dann würde ich dir ebenfalls zu einer Datenbank raten.

Die Daten kannst du trotzdem in Excel erstellen, wenn dir das am meisten liegt, Tools wie etwa Sqliteman können sowohl .csv als auch "MS Excel XML" importieren.

Tutorials zu Datenbank-Handling findest du im Netz zuhauf, daran sollte es also nicht scheitern.

Antworten
Appsoluts
  • Forum-Beiträge: 304

03.01.2013, 12:59:34 via Website

Ich würd ne Kombination aus Beidem nehmen.
Zur Speicherung definitiv eine kleine Datenbank und Einlesen per XML oder CSV relativ egal.

Es gibt fertige parser, die du in dein Projekt importieren und nutzen kannst.

Antworten
Rolf Hardt
  • Forum-Beiträge: 19

03.01.2013, 20:56:30 via Website

Hallo Leute,
vielen Dank für eure Antworten und Anregungen.
Also ich denke die "Datenbank" wird max. 500 Datensätze groß werden. Je Datensatz werden 3 Strings und 5 doubles benötigt.
Bin mir nicht sicher ob ich dafür ne wirkliche Datenbank brauche. Vor allem habe ich mit echter Datenbankprogrammierung (MySQL) o.ä. noch überhaupt keinen Kontakt hatte. Ich will ja meinen alten Kopf nicht überbelasten ;-)
Ich denke ich gehe den Weg csv -> WinAnwendung -> xml.
Sollte doch keine Ewigkeit dauern, dann in der app, einen xml-Datensatz von max. 500 rauszufiltern.
Dann muß ich nur noch rausfinden wie ich die xml-Datei in meine app einbinde und auf diese zugreifen kann.
Vermutlich werden einige von euch darüber schmunzeln, aber ich bin halt Anfänger in der Androidprogrammierung und aller Anfang ist bekanntlich schwer.

Trotzdem danke,
Rolf

Antworten
Andy N.
  • Forum-Beiträge: 3.112

03.01.2013, 23:13:19 via Website

Eine SQL-Abfrage geht schon bedeutend schneller als ein xml zu durchsuchen. Gerade wenn Du mit Filtern arbeiten willst, dann könnte das eine langweilige Geschichte werden.

Man muss auch keine SQL Statements kennen, Android macht das einem sehr einfach. Wobei das auch nur eine einfache Tabelle wäre.
Hier ein kurzes Tutorial:
http://www.vogella.com/articles/AndroidSQLite/article.html

Wenn Du mit einer Datenbank arbeiten willst (was wirklich zu empfehlen ist), erstelle am besten eine Option eine CSV einzulesen und arbeite diese Zeile für Zeile ab und schreibe diese in die Datenbank. Das sollte nicht schwer sein und dürften nur ein paar Zeilen sein.
Eine XML auszulesen finde ich persönlich schwieriger als eine CSV und dürfte auch langsamer sein.

Nachtrag:
Beachte auch, dass lange Ausführungen die Activity blockieren. Wenn Du mit einer xml arbeitest kann schnell der Dialog kommen, ob Du die App abschießen willst, wenn Du den Programmcode nicht in einem eigenem Threat laufen lässt. Eine SQL Abfrage geht dagegen so schnell, dass man die nicht merkt und ist denk ich leichter als mit Threats zu arbeiten.

— geändert am 03.01.2013, 23:27:32

Antworten
Rolf Hardt
  • Forum-Beiträge: 19

04.01.2013, 20:56:12 via Website

Hallo Andy,
vielen Dank für den Input. Also werde ich mir mal das Tutorial reinziehen und mich an der Datenbank versuchen.
Vielen Dank auch für den Link.

@alle: Ich muß sagen ich habe bisher wenige Foren erlebt wo man soviel wirklich kompetente Hilfe bekommt. :):):)
Hut ab !
Eine Frage noch die sicherlich hier nicht hin gehört.
Ich bin bisher noch nicht wirklich dahinter gestiegen wie der Debugger in Eclipse funktioniert.
Ich kann zwar Haltepunkte setzen, aber wie ich mir dann Variablen etc. anschauen kann hab ich bisher noch nicht geblickt.
Wäre dankbar für einen kleinen und vermutlich entscheidenden Hinweis.

Bis denne,
Rolf

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

04.01.2013, 23:08:02 via Website

Eine Frage noch die sicherlich hier nicht hin gehört.

Warum nicht?


Ich kann zwar Haltepunkte setzen, aber wie ich mir dann Variablen etc. anschauen kann hab ich bisher noch nicht geblickt.

Hm, das funktioniert genauso wie zB in Netbeans oder Visual Studio: App im Debugger starten (also nicht "run as" sondern "debug as" benutzen), wenn die Ausführung auf einen Breakpoint läuft, dann wechselt Eclipse in die Debug-Perspektive, in der du dann den betreffenden Source siehst, und auch ein Fenster "(x)= Variables"; meistens funktioniert auch das Überfahren der gewünschten Variablen im Sourcecode mit der Maus.

Oder meintest du etwas anderes?

Antworten
Rolf Hardt
  • Forum-Beiträge: 19

05.01.2013, 12:23:29 via Website

ja das meinte ich, aber irgendwie hat es bei mir so nicht funktioniert.
Wollte es gerade nochmal testen aber irgendwie geht heute gar nichts. Wenn ich die app starte, egal ob im debug modus oder als run as startet der emulator aber dann bleibt eclipse mit der konsolenmeldung "[2013-01-05 12:16:18 - TechCalculator] Waiting for HOME ('android.process.acore') to be launched..." hängen. Ich nehme an die Rückmeldung vom Emulator fehlt.
Hmmmm erstmal sehen wie ich das in den Griff bekomme.
Dann werde ich nochmal den debugger testen.....

Update: Jetzt hat es funktioniert. k.a. was ich vorher falsch gemacht habe
Danke !

— geändert am 05.01.2013, 13:13:57

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

05.01.2013, 16:57:08 via Website

Den Emulator habe ich noch nie als brauchbares Werkzeug empfunden, schon weil man überhaupt keine Abschätzung zur Performance der eigenen App erhält.
Hast du kein Phone, auf dem du testen kannst?

Antworten
Rolf Hardt
  • Forum-Beiträge: 19

05.01.2013, 23:01:07 via Website

Ich habe das S2 ....
Wenn ich meine Apps's endgültig testen will lade ich die .apk via bluetooth auf das handy.
Wie machst du es denn ? lädst du jeden "versuch" auf dein handy ?

Antworten
Andy N.
  • Forum-Beiträge: 3.112

05.01.2013, 23:22:41 via Website

Du kannst Dein Telefon verwenden wie den Emulator. Debugging in den Einstellungen Deines Telefons aktivieren, Telefon über USB anstecken und jetzt sollte das ADT das Telefon erkennen und Du kannst Deine Apps aufs Telefon laden und debuggen. Wenn es gerootet ist, kannst Du auch über den File Explorer auf die Daten der App zugreifen.
Wenn Du Beispielsweise den Ort (GPS) manipulieren willst, musst Du das zuerst in den Einstellungen aktivieren.
Aus Sicherheitsgründen sollten man die Debughing-Option wieder abschalten, wenn man sie nicht braucht.

Den Emulator kann man aber auch gut verwenden, auch wenn er nur frickelig funktioniert. Am besten startet man den Emulator zu Beginn, dann spart man sich das lange Warten. Wenn ich auf Debug gehe, wird meisten der AVD auch nicht erkannt. Wenn ich aber zuerst die App mit Run... ausführe und dann nochmal mit Debug, kann geht es komischer Weise.

Antworten
Rolf Hardt
  • Forum-Beiträge: 19

06.01.2013, 12:28:22 via Website

Danke für die Tip's. Ich habe dummerweise nur ein USB-Kabel und das habe ich auf der Arbeit. Ich denke ich sollte mir mal ein zweites zulegen :-).
Ich habe auch festgestellt das es besser ist den Emulator laufen zulassen.
Zur Zeit kämpfe ich mit der Datenbank. Habe es immerhin schon geschafft eine Datenbank anzulegen. Nun muß ich nur noch rausfinden wie ich wieder an die Daten komme, weil sonst hilft sie mir nicht wirklich :wacko:

Antworten
Rolf Hardt
  • Forum-Beiträge: 19

06.01.2013, 18:14:37 via Website

Hallo Leute,
ich hab jetzt alles was ich für mein Projekt brauche.

-Datenbank anlegen
-Werte aus der Datenbank filtern und lesen

Das hat mir geholfen .....//de.wikibooks.org/wiki/Googles_Android/_Datenbankzugriffe ..... ich darf noch keine Links einbinden :(

Das weiter oben aufgeführte Tutorial war doch ziemlich verwirrend für einen Newbie.
Wie auch immer, der nächste Schritt wäre nun die CSV-Datei in eine Datenbank umzuwandeln.

Dazu müßte ich die CSV-Datei irgendwie in das Projekt einbinden damit ich von meiner App drauf zu greifen kann.

Die dann, mit der App erzeugte db, müßte ich dann in mein ursprüngliches Projekt einbinden.

Wäre dankbar für ein Tip wie ich die oben genannten Dateien von Eclipse aus in das Projekt einbinden kann.

Danke schonmal

Antworten
Andy N.
  • Forum-Beiträge: 3.112

06.01.2013, 18:52:46 via Website

Du kannst die Datei in das Projekt einbinden (ich glaube die kommt dann in den Ordner res/raw und kann mit R.raw geladen werden) oder über den Explorer (DDMS View) zum Beispiel auf die SD Karte kopieren und von da aus laden.

Antworten
Rolf Hardt
  • Forum-Beiträge: 19

06.01.2013, 19:06:11 via Website

Danke Andy für die schnelle Antwort.

ich wollte diese Daten mit openRawResource() öffnen aber scheinbar habe ich da irgendein Paket nicht installiert.

import android.content.Res; <-- diese klasse fehlt mir.

Weiß jemand welches Paket ich dazu installieren muß ?

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

06.01.2013, 19:18:13 via Website

Erm...
Warum willst du denn temporär die csv einbinden, um daraus dann eine DB zu erzeugen, die dann letztendlich eingebunden werden soll?

Entweder der Plan ist, die DB erst beim User zu erzeugen (was hier wenig Sinn machen würde), oder das die App mit einer fertigen DB daher kommt.

Im 2. Fall kannst du die csv am PC in eine DB importieren und die dann beilegen (wobei das je nach Größe auch nicht unbedingt optimal ist).

Oder übersehe ich gerade irgend etwas?

Antworten
Rolf Hardt
  • Forum-Beiträge: 19

06.01.2013, 19:34:53 via Website

Nö du übersiehst nicht. Ich wollte einfach zu Übungszwecken mal ne app schreiben die aus der csv ne db macht. Ich weiß das ist :girl: -ly like.

Mein problem vom letzten Post hat sich auch erledigt. Wer googeln kann ist klar im Vorteil :D

Antworten
Rolf Hardt
  • Forum-Beiträge: 19

06.01.2013, 21:47:14 via Website

and dev
(wobei das je nach Größe auch nicht unbedingt optimal ist).

@and dev: was wäre dann deiner Ansicht nach die optimale Lösung für mein Eingangs geschildertes Problem ? Die Größe der csv-Datei ist z.Zt. ca 9kB. Weiß noch ncht wie groß die DB daraus wird.

@all: csv-Datei lesen funzt jetzt auch. Wenn ich meine CSVtoSQL app fertig habe werde ich das mal posten in den code snippets. Vielleicht hilft es ja jemanden. Ich hab's mir bis jetzt schließlich auch so zusammen gebastelt.

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

06.01.2013, 23:22:16 via Website

Ich wollte einfach zu Übungszwecken mal ne app schreiben die aus der csv ne db macht. Ich weiß das ist :girl:-ly like.

Nö, finde ich gut, daran erkennt man, das du das wirklich lernen/verstehen möchtest :)


Die Größe der csv-Datei ist z.Zt. ca 9kB. Weiß noch ncht wie groß die DB daraus wird.

Bei der Größe will ich nichts gesagt haben ;)
Bei mitgelieferten DBs besteht iZ mit Android halt üblicherweise das Problem, das die am Ende 2 mal Platz benötigen, weil die App sie in einen beschreibbaren Bereich umkopieren muss; daher bevorzuge ich das Herunterladen der DB beim ersten Start -- allerdings sind "meine" DBs üblicherweise auch erheblich größer (letztes Projekt: ca 80MB )

Antworten
Rolf Hardt
  • Forum-Beiträge: 19

08.01.2013, 22:53:03 via Website

Hallo Leute,
hier ist das Ergebnis. Weiß nicht ob der Code hierhin gehört. Aber wofür gibts die Admin's :lol:

However es ist nicht quick aber dirty programmiert und es beinhaltet alles was man braucht um eine externe Datei zu lesen (csvwerte.csv) und es zeigt wie man eine Datenbank anlegen kann und dort Daten hinzufügt und wie man diese abfragt. Vielleicht hilft es ja jemanden.

1package de.testdatabase.blabla;
2
3import java.io.BufferedReader;
4import java.io.IOException;
5import java.io.InputStream;
6import java.io.InputStreamReader;
7import java.util.StringTokenizer;
8
9import android.os.Bundle;
10import android.app.Activity;
11import android.content.ContentValues;
12import android.database.Cursor;
13import android.database.sqlite.SQLiteDatabase;
14import android.database.sqlite.SQLiteOpenHelper;
15import android.view.Menu;
16import android.widget.Toast;
17
18public class MainActivity extends Activity {
19
20 @Override
21 protected void onCreate(Bundle savedInstanceState) {
22 super.onCreate(savedInstanceState);
23 setContentView(R.layout.main);
24
25 SQLiteDatabase db;
26
27 db = openOrCreateDatabase("dbmaterial",
28 SQLiteDatabase.CREATE_IF_NECESSARY,
29 null);
30
31 onCreateDB(db);
32
33 InputStream in = getResources().openRawResource(R.raw.csvwerte);
34
35 if(in != null){
36
37 BufferedReader br = new BufferedReader(new InputStreamReader(in));
38 String line = null;
39
40 try {
41 while((line = br.readLine()) != null){
42 addItem(db,line);
43 }
44 } catch (IOException e) {
45 e.printStackTrace();
46 }
47
48 }
49
50
51 Cursor result=db.rawQuery("select distinct gruppe from dbmaterial", null);
52 String s="";
53 while(result.moveToNext ())
54 s+=result.getString(0)+"\n";
55 Toast.makeText(this, s, Toast.LENGTH_LONG).show();
56
57
58 Cursor result1=db.rawQuery("SELECT dincode FROM dbmaterial WHERE gruppe = 'STAHL'", null);
59 String s1="";
60 while(result1.moveToNext ())
61 s1+=result1.getString(0)+"\n";
62 Toast.makeText(this, s1, Toast.LENGTH_LONG).show();
63
64 Cursor result11=db.rawQuery("SELECT kcwert FROM dbmaterial WHERE dincode = 'ST37'", null);
65 String s11="";
66 while(result11.moveToNext ())
67 s11+=result11.getString(0)+"\n";
68 Toast.makeText(this, s11, Toast.LENGTH_LONG).show();
69
70 db.close();
71
72
73 }
74
75 @Override
76 public boolean onCreateOptionsMenu(Menu menu) {
77 // Inflate the menu; this adds items to the action bar if it is present.
78 getMenuInflater().inflate(R.menu.main, menu);
79 return true;
80 }
81
82 public void onCreateDB(SQLiteDatabase db) {
83 String sql = "create table dbmaterial( id integer primary key autoincrement," +
84 " gruppe varchar(20) not null," +
85 " dincode varchar(20) not null," +
86 " ansicode varchar(20) not null," +
87 " isocode varchar(20) not null," +
88 " kcwert varchar(5) not null," +
89 " mcwert varchar(5) not null)";
90 db.execSQL(sql);
91 }
92
93 public void addItem(SQLiteDatabase db, String string){
94
95 StringTokenizer st = new StringTokenizer(string,";");
96
97 String sql ="insert into dbmaterial(gruppe,dincode,ansicode,isocode,kcwert,mcwert) values (" +
98 "'"+st.nextToken().toString().trim()+"',"+
99 "'"+st.nextToken().toString().trim()+"',"+
100 "'"+st.nextToken().toString().trim()+"',"+
101 "'"+st.nextToken().toString().trim()+"',"+
102 "'"+st.nextToken().toString().trim()+"',"+
103 "'"+st.nextToken().toString().trim()+"')";
104 db.execSQL(sql);
105 }
106
107}

Gruß und Danke an alle Unterstützer und TuTWriter's

Antworten
Rolf Hardt
  • Forum-Beiträge: 19

07.02.2013, 21:49:33 via Website

Hallo Leute,
da bin ich wieder. Hab weiter an meinem Projekt gearbeitet und einiges gelernt.
Jetzt brauch ich doch nochmal eure Hilfe.

Problem:
Ich fülle ein String array durch eine Datenbank Funktion und will das Ergebnis anschließend in einem List View anzeigen.
Die Array Elemente kommen an da der Log.v die richtigen Daten ausgibt. Aber der List View bleibt leer. Habe es mal mit "synchronized" versucht aber das hat auch nicht geholfen.

1setContentView(R.layout.showmateriallist);
2 adapter = new ArrayAdapter<String>(this,
3 android.R.layout.simple_list_item_1, listItems);
4 setListAdapter(adapter);
5
6 Log.v("MaterialList", "onCreate");
7
8 if (listItems.isEmpty()) {
9 listItems = db.getGroupLists();
10 synchronized (listItems) {
11 listItems.add("Alle Materialien anzeigen");
12
13 for(String i:listItems)
14 Log.v("listItems", i);
15
16 getMaterialFromGroup = true;
17 adapter.notifyDataSetChanged();
18
19 }
20 }


Bin für jede Anregung .... wie immer.... dankber,
Thx

Antworten
Christian
  • Forum-Beiträge: 307

07.02.2013, 22:54:03 via Website

Hi Rolf,

gib es eigentlich einen Grund warum du erst das Layout setzt und dann schaust ob listItems leer sind?


Mfg Christian

Antworten
Rolf Hardt
  • Forum-Beiträge: 19

08.02.2013, 09:29:12 via Website

Hallo Christian,
ja es gibt einen Grund. Ich möchte die Liste beim ersten Start dieser Activity mit einem anderen Inhalt füllen wie bei einem späteren Start. D.h. ich verwende diesen ListView um verschieden Listen anzuzeigen. Ich weiß nicht ob das die feine englische Java-Art ist (vermutlich nicht :*), aber es ist halt so geworden.

Gruß,
Rolf

Antworten
Christian
  • Forum-Beiträge: 307

09.02.2013, 14:48:39 via Website

Hi Rolf,


Ich möchte die Liste beim ersten Start dieser Activity mit einem anderen Inhalt füllen wie bei einem späteren Start. D.h. ich verwende diesen ListView um verschieden Listen anzuzeigen.

Warum sollte das schlecht sein? Wieder Verwendung von Code ist doch einer der Grundpfeiler der Objektorientierung.

Zu deinem Problem:
Das mit dem "notifyDataSetChanged();" funktioniert so nicht da es nur greift wenn du die "orginal" List veränderst also Element hinzufügst oder entfernst.
Beispiel: Eine Liste mit Namen -> wenn auf einen Namen geklickt wird soll dieser aus der Liste gelöscht werden

Code: Github Gist

So um nun dein Problem zu lösen wäre meine Idee das du einfach einen neuen Adapter erstellt.
Beispiel: Eine Liste mit Namen -> wenn auf einen Namen geklickt wird sollen alle Namen ausgetauscht werden

Code: Github Gist

Hoffe das bringt dich weiter.

Mfg Christian

EDIT: Links ausgetauscht

— geändert am 26.02.2013, 17:59:01

Antworten
Rolf Hardt
  • Forum-Beiträge: 19

10.02.2013, 15:46:49 via Website

Hallo Christian,
ich habe es so gelößt....

1@Override
2 public void onCreate(Bundle savedInstanceState) {
3 super.onCreate(savedInstanceState);
4
5 db = new MaterialDB(this);
6 db.open();
7
8 if (listItems.isEmpty()) {
9
10 listItems = db.getGroupLists();
11 listItems.add(getString(R.string.stringShowAllMaterial));
12 getMaterialFromGroup = true;
13
14
15 }
16
17 setContentView(R.layout.showmateriallist);
18 adapter = new ArrayAdapter<String>(this,
19 android.R.layout.simple_list_item_1, listItems);
20 setListAdapter(adapter);

Der Array listItems wird jetzt vor dem erzeugen des Adapters mit Werten versorgt.
Und wenn sich die Liste später nochmal ändert rufe ich nochmal onCreate() auf.
Funktioniert ganz gut.
Trotzdem danke.

Gruß,
Rolf

Antworten