Quizapp - Datenbank: von mysql zu sqlite?

  • Antworten:16
  • Bentwortet
Tim Meißner
  • Forum-Beiträge: 238

08.11.2010, 22:01:23 via Website

Moin!

Ich möchte gerne zum Üben eine kleine Quizapp entwickeln. Diese soll auf eine webgestützte Datenbank (zum editieren, befüllen) zurückgreifen, die je nach Lust und Laune dann auf das Gerät heruntergeladen wird zum aktualisieren. Ich hatte mir gedacht, das ich dann einfach die DB Datei für android auf meinem Webserver zur Verfügung stelle und sie dann jedes mal komplett heruntergeladen wird (dürfte eh nicht groß sein).

Auf meinem Webserver läuft mysql und dort liegen auch einige PHP Skripte zum erstellen der Fragen in der DB.

Meine Frage: wie exportiere ich meine mysql DB jetzt so, dass ich sie in Android dann benutzen kann um die gegenwärtige DB meiner APP upzudaten oder zu überschreiben?

Edit: Oder ich erstelle das ganze gleich pur mit sqlite. Wie kann ich nun eine sqlite DB von meinem Webserver auf das Handy (SD-Karte?) kriegen und nutzen?

Habe es wahrscheinlich komplizierter beschrieben als es eigentlich ist, hoffe ihr könnt mir helfen und ein paar Denkanstöße geben :)

Mit freundlichen Grüßen
Tim Meißner

— geändert am 08.11.2010, 22:25:57

Antworten
tomig
  • Forum-Beiträge: 138

08.11.2010, 22:32:27 via App

Schau mal per phpinfo() ob sqlite freigeschaltet ist, dann sparst dir das konvertieren und mit php kann man auch in eine sqlite dB schreiben.

ich muß gar nix... www.tomig.at

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

08.11.2010, 22:32:47 via Website

Hi,
hab mal kurz gegoogelt und da kamen schon ein paar Mögliche Lösungen..
- Deutsch
- English

Hoffe, das hilft weiter.. :)
Lg Ansgar

Antworten
Tim Meißner
  • Forum-Beiträge: 238

08.11.2010, 22:58:17 via Website

Vielen dank schonmal für eure Antworten. Ich denke ich mache das nun doch gleich alles mit sqlite.
Meinem Webserver kann ich zur not auch sqlite beibringen :p

Also jetzt: Wie kann ich nun eine sqlite DB von meinem Webserver auf das Handy (SD-Karte?) kriegen und nutzen?

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

08.11.2010, 23:04:58 via App

Also,
ich würde sie einfach runterladen und dann im Anwendungsverzeichnis ("/data/data/dein.paketname.de") speichern und dann als sqlite öffnen..
Lg Ansgar
edit: alternativ könnte man site auch auf der SD-Karte sichern, nur dann ist sie (zumindest vor nicht-roots) ungeschützt...
Habe aber von irgendwem hier schon gehört, das er die Datenbank zB. durch hinzufügen von irgendwelchen Bytes kaputt, also nicht lesbar macht, und nur er sie nach dem Entfernen der Bytes wieder benutzen kann.. Hoffe mal, das er das damals so gemeint hat :grin:

— geändert am 08.11.2010, 23:09:28

Antworten
Tim Meißner
  • Forum-Beiträge: 238

08.11.2010, 23:08:42 via Website

Gibts da keine Möglichkeit das auf der SD-Karte zu speichern und zu laden?

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

08.11.2010, 23:13:32 via App

Oh,
da war mein Edit wohl zu langsam...:grin:
Lg Ansgar

Antworten
Tim Meißner
  • Forum-Beiträge: 238

11.11.2010, 19:04:32 via Website

Ok danke.

WIE und WO speichere ich die Datenbank jetzt auf der SD Karte? Und wie greife ich dann auf die Datenbank zu?

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

11.11.2010, 22:08:32 via App

Also,
ich selbst hab noch keine App mit Daten laden aus dem Internet geschrieben, aber dafür findest du sicher Tutorials im Netz (meistens Bild oder ähnliches runterladen..). Und für auf der SD-Karte „arbeiten“ gibt es den Fileinputstream und den Fileoutputstream. Da findest du sicher auch Tutorials und Beispiele..
Lg Ansgar
P.S. Ich kann dir sonst morgen auch mal Links aus meiner dicken Firefox-Android-Programmierung-Lesezeichen-Wunderkiste suchen.. :grin:

Antworten
Tim Meißner
  • Forum-Beiträge: 238

11.11.2010, 22:10:54 via Website

Hey Ansgar, vielen dank für deine Vorschläge.

Google hat mich allerdings noch nicht wirklich weitergebracht :(
Wäre sehr nett wenn du mir morgen dazu noch ein paar Links posten könntest.

Und wie ist der Pfad zur sdcard?

"sdcard://meinOrdner" ?

— geändert am 11.11.2010, 22:23:43

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

11.11.2010, 22:43:17 via App

Vielleicht schaff ich's auch heute noch, müsste ich halt den PC anschalten.. Achja, SD-Karte ist einfach '/sdcard/' glaub ich, die externe SD-Karte ist '/sdcard/sd/' bzw. /sdcard/external_sd' unter Froyo, hab da aber noch nichts gemacht.. Ich speicher immer im Verzeichnis der App '/data/data/dein.paket.name/'... Alle Angaben ohne Gewähr:grin:
Lg Ansgar
P.S. Wenn du root hast kannst du auch mal mit einem geeigneten Dateiexplorer „auf Entdeckungstour“ gehen.. Oder du klickst in Eclipse bei laufendem AVD, also virtuellem Android Gerät, auf DDMS und guckst da in den 'File Explorer'

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

12.11.2010, 01:07:25 via Website

Und wie ist der Pfad zur sdcard?

"/sdcard/meineAPP/data.db3"

Sauberer wird wohl das hier sein:
Environment.getExternalStorageDirectory().toString()+"/meineAPP/data.db3"
da weiss ich aber gerade nicht auswendig, ab welchem SDK das verwendet werden kann.

Antworten
Tim Meißner
  • Forum-Beiträge: 238

12.11.2010, 07:41:58 via Website

geht seit api 1, danke!

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

12.11.2010, 09:40:11 via Website

...und diesen Pfad kannst du dann sowohl beim Download der Datei als auch beim Öffnen als Datenbank verwenden.
Funktioniert also alles ganz genau so wie beim internen Speicher auch.

Antworten
Tim Meißner
  • Forum-Beiträge: 238

12.11.2010, 17:58:07 via Website

Okay und wenn ich nun die Datenbank mit der App ausliefern will?
D.h. nicht noch ein extra Download auf die sdcard nötig wäre.

Wo muss ich die sqlite Datei in Eclipse hinpacken und wie kann ich die Datei dann benutzen?

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

12.11.2010, 18:08:17 via App

Hi,
die Datei kommt dann in den asset-folder. Die wird dann auch mit nem Stream kopiert, wie du den assets-Ordner ansprichst findest du unter dem Suchbegriff bei Google..
Lg Ansgar

Antworten
Tim Meißner
  • Forum-Beiträge: 238

13.11.2010, 11:46:33 via Website

Habe es jetzt einigermaßen hinbekommen zu meiner Zufriedenheit ... im Emulator :angry:
Wenn ich das auf meinem Desire ausprobiere crasht die App, weil die Datenbank nicht gelesen wird? (meine ArrayList wo ich die Fragen abspeichere bleibt leer, ich vermute das einfach das rüberkopieren aus dem Assets Ordner nicht klappt oder der Pfad nicht stimmt wo ich die DB lese, dazu mal paar code zeilen)

Der Crash findet statt in der Funktion getRandomQuestion() (wohl weil das Array leer ist und da irgendwo eine NullpointerException auftaucht, ka), aber ist ja uach egal... meine Datenbank liegt im assets ordner als "fragen.sqlite".

Meine Deutschen + Englischen Bezeichnungen müsst ihr garnicht erst kommentieren :p

Wichtiger Code aus der einen Datei:

1public static final String MY_STORAGE = Environment.getExternalStorageDirectory().toString()+"/AllgemeinWissen/"; //+ filename
2 public static final String WEB_LINK = "http://universe-gamingcentral.com/data.sqlite";
3 public static final String DATA_FILE = "databases/fragen.sqlite";
4 public static final String MY_INTERNAL_STORAGE = "/data/data/de.tm.android.allgemeinwissen/";
5
6private void copyoverdatabase() {
7 AssetManager am = getResources().getAssets();
8 try {
9 InputStream is = am.open("fragen.sqlite");
10 BufferedInputStream bis = new BufferedInputStream(is);
11 ByteArrayBuffer baf = new ByteArrayBuffer(50);
12
13 int c;
14 while((c = bis.read()) != -1)
15 {
16 baf.append(c);
17 }
18 byte[] buffer = baf.toByteArray();
19 File file = new File(Hauptmenu.MY_INTERNAL_STORAGE);
20 file.mkdirs();
21 file.createNewFile();
22 FileOutputStream fos = new FileOutputStream(file);
23 fos.write(buffer);
24 fos.close();
25 bis.close();
26 is.close();
27
28
29 } catch (IOException e1) {
30 e1.printStackTrace();
31 }
32
33 }

Hier Teile der anderen Datei:
1@Override
2 public void onCreate(Bundle savedInstanceState) {
3{
4SQLiteDatabase myDB = null;
5 try {
6
7 // Create the Database (no Errors if it already exists)
8 myDB = this.openOrCreateDatabase(Hauptmenu.MY_STORAGE + Hauptmenu.DATA_FILE, MODE_PRIVATE, null );
9 Cursor c = myDB.rawQuery("SELECT * FROM fragenkatalog;", null);
10 startManagingCursor(c);
11
12
13 //read through the result of the query and generate questions
14 while(c.moveToNext())
15 {
16 int id = c.getInt(c.getColumnIndex("id"));
17 int category = c.getInt(c.getColumnIndex("category"));
18 String question = c.getString(c.getColumnIndex("question"));
19 int correct = c.getInt(c.getColumnIndex("correct_answer"));
20
21 String[] answer = new String[] {c.getString(c.getColumnIndex("answer1")), c.getString(c.getColumnIndex("answer2")),c.getString(c.getColumnIndex("answer3")),c.getString(c.getColumnIndex("answer4"))};
22 Frage frage = new Frage(id,question, answer, correct, category);
23 fragenKatalog.add(frage);
24 }
25
26
27 }
28 catch(Exception e)
29 {
30 Log.d("Constructor", e.toString());
31 }
32 finally
33 {
34 if (myDB != null)
35 myDB.close();
36 }
37
38 nextQuestion();
39}

1private Frage getRandomQuestion()
2 {
3
4 Frage frage = null;
5 int maxQuestions = fragenKatalog.size();
6
7 Random randomGenerator = new Random();
8
9 int randomQuestion = randomGenerator.nextInt(maxQuestions);
10 frage = fragenKatalog.get(randomQuestion);
11
12 if(answeredCorrect.size()==fragenKatalog.size())
13 {
14 answeredCorrect.clear();
15 Toast.makeText(getApplicationContext(), R.string.all_questions_answered, Toast.LENGTH_SHORT).show();
16 return frage;
17 }
18
19 for(int i=0;i<answeredCorrect.size();i++)
20 {
21 Frage _frage = answeredCorrect.get(i);
22 if(frage.id==_frage.id)
23 return getRandomQuestion();
24 }
25
26 return frage;
27
28
29
30
31 };
32
33 private void nextQuestion()
34 {
35 Toast.makeText(getApplicationContext(), "Anzahl Fragen: "+fragenKatalog.size(), Toast.LENGTH_SHORT).show();
36
37 //first question to be answered?
38 if(currentQuestion==null)
39 {
40 //currentQuestion = getRandomQuestion();
41 if(currentQuestion!=null)
42 {
43 tvQuestion.setText(currentQuestion.question);
44 rb1.setText(currentQuestion.answers[0]);
45 rb2.setText(currentQuestion.answers[1]);
46 rb3.setText(currentQuestion.answers[2]);
47 rb4.setText(currentQuestion.answers[3]);
48 }
49
50 }
51 else //not the first question that is going to be answered
52 {
53 answeredCorrectly();
54 currentQuestion = getRandomQuestion();
55 tvQuestion.setText(currentQuestion.question);
56 rb1.setText(currentQuestion.answers[0]);
57 rb2.setText(currentQuestion.answers[1]);
58 rb3.setText(currentQuestion.answers[2]);
59 rb4.setText(currentQuestion.answers[3]);
60
61 // Get the ViewFlipper from the layout
62 ViewFlipper vf = (ViewFlipper) findViewById(R.id.details02);
63 // Set an animation from res/anim: I pick push left out
64 vf.setAnimation(AnimationUtils.loadAnimation(vf.getContext(), R.anim.slide_left));
65 vf.showNext();
66 }
67 }

edit: fehler gefunden ... hatte beim kopieren nur auf den ordner zugegriffen und nicht auf die datei die ich erzeugen möchte (pfad war ein ordner)

— geändert am 13.11.2010, 13:22:18

Antworten