Datenbank aus dem Web herunterladen - Probleme

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

21.11.2010, 15:26:26 via Website

Moin!

Habe bei meiner App Meine App ein paar Probleme.

Theoretisch tut dieser Code hier unten was ich möchte. Praktisch funktioniert es nicht auf jedem Gerät. Der Emulator klappt im Moment auch nicht. Vorhin hats aber funktioniert??^^
Manchmal wird einfach nur eine 0KB große Datei erzeugt (die echte ist 21KB groß).

Hat jemand eine Idee?
Wäre euch sehr verbunden wenn ihr mir helfen könntet :)

1public static final String MY_STORAGE = Environment
2 .getExternalStorageDirectory().toString() + "/AllgemeinWissen/databases/"; // +
3 // filename
4 public static final String DATA_FILE = "fragen.sqlite";
5 public static final String MY_INTERNAL_STORAGE = "/data/data/de.tm.android.allgemeinwissen/";
6 public static final String WEB_LINK = "http://universe-gamingcentral.com/fragen_release.sqlite";
7
8protected void downloadDatabase() {
9 Toast.makeText(getApplicationContext(), R.string.download_started,
10 Toast.LENGTH_SHORT).show();
11 byte[] buffer = downloadFile(WEB_LINK);
12 try {
13 File file = new File(MY_STORAGE);
14 if (!file.exists())
15 file.mkdirs();
16 file = new File(MY_STORAGE + DATA_FILE);
17 if(file.exists())
18 {
19 file.delete();
20 file = new File(MY_STORAGE + DATA_FILE);
21 }
22 FileOutputStream fos = new FileOutputStream(file);
23 fos.write(buffer);
24 } catch (Exception e) {
25 Log.d("DownloadDatabase", e.toString());
26 e.printStackTrace();
27 Toast.makeText(getApplicationContext(), R.string.download_failed,
28 Toast.LENGTH_LONG).show();
29 return;
30 }
31 Toast.makeText(getApplicationContext(), R.string.download_completed,
32 Toast.LENGTH_SHORT).show();
33 }
34
35 private byte[] downloadFile(String urlString) {
36 BufferedInputStream bis = null;
37
38 try {
39 URL url = new URL(urlString);
40 URLConnection conn = url.openConnection();
41 bis = new BufferedInputStream(conn.getInputStream());
42 } catch (Exception e) {
43 Toast.makeText(getApplicationContext(), R.string.download_failed,
44 Toast.LENGTH_LONG).show();
45 e.printStackTrace();
46 }
47 ByteArrayBuffer baf = new ByteArrayBuffer(50);
48
49 int c;
50 try {
51 while ((c = bis.read()) != -1) {
52 baf.append(c);
53 }
54 } catch (Exception e) {
55 }
56
57 byte[] buffer = baf.toByteArray();
58
59 return buffer;
60
61 }

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

21.11.2010, 16:21:29 via Website

Hallo Tim,

unter welchen Umständen ist das denn so? Datei exisitiert schon, Datei existiert noch nicht?

Ich bin mir ja nicht ganz sicher, aber Du erstellst ein File, und löscht es gleich wieder um es daraufhin nochmal neu zu erstellen ...
1file = new File(MY_STORAGE + DATA_FILE);
2 if(file.exists())
3 {
4 file.delete();
5 file = new File(MY_STORAGE + DATA_FILE);
6 }

Ich würde da ein Else if einbauen .. Ich denke der verhaspelt sich da vorhersehbarerweise von Zeit zu Zeit ...

Oder bin ich da jetzt so völlig auf dem Holzweg?

lg Voss

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

21.11.2010, 18:20:27 via Website

Edit: Habe herausgefunden das der Fehler garnicht dort liegt :/
Es geht viel mehr darum das meine DB manchmal nicht geladen wird?

111-21 17:40:58.093: WARN/System.err(435): java.lang.IllegalArgumentException: File /sdcard/AllgemeinWissen/databases/fragen.sqlite contains a path separator
211-21 17:40:58.102: WARN/System.err(435): at android.app.ApplicationContext.makeFilename(ApplicationContext.java:1444)
311-21 17:40:58.102: WARN/System.err(435): at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:472)
411-21 17:40:58.102: WARN/System.err(435): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193)
511-21 17:40:58.112: WARN/System.err(435): at de.tm.android.allgemeinwissen.Fragemanager.onCreate(Fragemanager.java:86)
611-21 17:40:58.112: WARN/System.err(435): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
711-21 17:40:58.112: WARN/System.err(435): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2444)
811-21 17:40:58.112: WARN/System.err(435): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2497)
911-21 17:40:58.122: WARN/System.err(435): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
1011-21 17:40:58.122: WARN/System.err(435): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1848)
1111-21 17:40:58.122: WARN/System.err(435): at android.os.Handler.dispatchMessage(Handler.java:99)
1211-21 17:40:58.122: WARN/System.err(435): at android.os.Looper.loop(Looper.java:123)
1311-21 17:40:58.122: WARN/System.err(435): at android.app.ActivityThread.main(ActivityThread.java:4338)
1411-21 17:40:58.122: WARN/System.err(435): at java.lang.reflect.Method.invokeNative(Native Method)
1511-21 17:40:58.132: WARN/System.err(435): at java.lang.reflect.Method.invoke(Method.java:521)
1611-21 17:40:58.132: WARN/System.err(435): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
1711-21 17:40:58.132: WARN/System.err(435): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
1811-21 17:40:58.132: WARN/System.err(435): at dalvik.system.NativeStart.main(Native Method)
1fragenKatalog = new ArrayList<Frage>();
2
3 SQLiteDatabase myDB = null;
4 try {
5
6 // Create the Database (no Errors if it already exists)
7 myDB = this.openOrCreateDatabase(Hauptmenu.MY_STORAGE + Hauptmenu.DATA_FILE, MODE_PRIVATE, null );
8 Cursor c = myDB.rawQuery("SELECT * FROM fragenkatalog;", null);
9 startManagingCursor(c);
10
11
12 //read through the result of the query and generate questions
13 while(c.moveToNext())
14 {
15
16 int id = c.getInt(c.getColumnIndex("id"));
17 int category = c.getInt(c.getColumnIndex("category"));
18 String question = new String(c.getString(c.getColumnIndex("question")));
19 int correct = c.getInt(c.getColumnIndex("correct_answer"));
20
21
22 String[] answer = new String[] {c.getString(c.getColumnIndex("answer1")), c.getString(c.getColumnIndex("answer2")),c.getString(c.getColumnIndex("answer3")),c.getString(c.getColumnIndex("answer4"))};
23 Frage frage = new Frage(id,question, answer, correct, category);
24 fragenKatalog.add(frage);
25 }
26
27
28 }
29 catch(Exception e)
30 {
31 Log.d("Constructor", e.toString());
32 e.printStackTrace();
33 }
34 finally
35 {
36 if (myDB != null)
37 myDB.close();
38 }

— geändert am 21.11.2010, 18:44:58

Antworten