.sql Datei in SQLite Datenbank umwandeln

  • Antworten:13
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 57

31.03.2016, 16:04:33 via Website

Hallo Community,

ich habe eine .sql Datei mit der Anweisungen wie "CREATE TABLE IF NOT EXISTS ..." und "INSERT INTO ...".
Draus möchte ich eine Datenbank erstellen lassen.
Allerdings ist die Datei zu groß (1,42 MB) um in eine String-Variable zu passen.
Die Datei befindet sich in die raw Ordner.

Mit diesem Code kann ich ein BufferedReader erzeugen:

    InputStream inputStream = context.getResources().openRawResource(R.raw.die_sql_Datei);
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

Aber wie ich das in die SQLiteDatabase.execSQL() Methode rein packen kann, konnte ich ins Internet nicht finden.

Kann jemand dabei helfen?

— geändert am 31.03.2016, 22:46:33

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

31.03.2016, 18:43:26 via App

Ich würde extern am PC eine DB mit nem Programm erstellen und diese dann in die App kopieren

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

Can Erdener Yazar

Antworten
  • Forum-Beiträge: 57

31.03.2016, 22:43:24 via Website

Hallo Pascal,

vielen Dank. Nachdem ich es hingekriegt habe, habe ich dein Idee gelesen und ich finde, dass
deine Idee besser ist. So schont man auch den Prozessor und Arbeitsspeicher.

Vollständigkeit halber:

    InputStream inputStream = context.getResources().openRawResource(R.raw.die_sql_datei);
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    String line = null;
    try {
        while ((line = bufferedReader.readLine()) != null) {
            this.lokalDB.execSQL(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

Dabei muss man beachten, dass jeder Zeile ein vollständige SQL-Anweisung darstellt.

Ich habe, so wie du mir geraten hast, die zuerst Datenbank erstellt und zwar mit "SQLite Manager" als AddOn in Firefox.
Das schreibe ich, weil meine erste Frage war, als ich deine Antwort gelesen habe: "Welche Programm kann ich dafür nehmen?".

Besten Dank nochmals.

— geändert am 31.03.2016, 22:45:39

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

31.03.2016, 23:03:49 via App

Entweder ein Addon so wie du es gemacht hast.
Ich hab dafur z.b. SqLite Browser benutzt.

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

Can Erdener Yazar

Antworten
  • Forum-Beiträge: 57

01.04.2016, 00:11:51 via Website

Besteht die Möglichkeit auf die in raw Verzeichnis liegende Datenbank zuzugreifen oder muss die Datenbank zwangsläufig in den /data/data/projekt/databases Ordner kopiert werden?

Und gleich noch eine Frage:
Bei einer von SQLiteOpenHelper abgeleitete Klasse:

SQLiteDatabase lokalDB;

protected DB_Verbindung(Context context) {
    super(context, "abc.db", null, 1);
    lokalDB = getWritableDatabase();
}// Konstruktor

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(...);
}

In diesem Code gibt es 2 SQLiteDatabase - Variable, warum ?
Warum benutzen wir biem definieren die "lokalDB" Variable und beim ausführen die "db" Variable?

— geändert am 01.04.2016, 01:14:41

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

01.04.2016, 09:37:46 via Website

Die Datenbank muss zwanngsläuftig im databases Ordner unter dem Projekt liegen.
Du kannst dir aber eine DB in Raw/Asset ordner legen und diese dann per Code in den anderen Ordner replizieren.
Dafür hattte ich auch mal ein Codeschnipsel, falls es dich interessiet such ich das raus.

Und du hast 2 Variablen einmal im Konstruktor: Da wird die DB geladen.
Wenn der DBAdapter merkt, es ist keine DB vorhanden, dann springt er in die onCreate und versucht eine neue DB anzulegen.
Damit wäre deine Variable localDB deine Datenbank wenn die existiert. Und wenn nicht musst du das entsprechend im onCreate behandeln, w.b. die DB aus dem Asset ordner lesen un kopieren o.ä.

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

Can Erdener Yazar

Antworten
  • Forum-Beiträge: 57

01.04.2016, 11:52:22 via Website

Vielen Dank für deine Antwort Pascal.

Der Codeschnipsel würde mich tatsächlich interessieren und ich wäre dir dankbar dafür.

Ich hätte noch 3 Fragen:
1. Was bedeutet w.b. ?
2. Wenn keine Datenbank existiert und die onCreate Methode aufgerufen wird, wird der Konstruktor danach erneut aufgerufen? Weil, man kann weiterhin mit lokalDB arbeiten, auch wenn die Datenbank durch onCreate neu erstellt wird.
3. Beim SQL Anweisung "create table if not exists", der Teil "if not exist" sinnlos, da onCreate Methode sowieso erst aufgerufen, wenn DB nicht existiert, stimmt's? onCreate Methode wird sonst nicht aufgerufen?

— geändert am 01.04.2016, 12:03:41

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

01.04.2016, 12:14:58 via Website

  1. Das war ein schreibfehler ,sollte z.b. heißen ;)
  2. Nein der Konstruktor wird dann nicht mehr aufgerufen, aber du kannst nach der erstellen dir dein DB Objekt holen und es in die Selbe variable speichern, damit erreichst du das gleiche.
  3. Genau, aber die Formulierung if not exists ist in SQL Standerd udn wird normalerweise mitgeneriert.
    Ist ja auch egal ob das jetzt da rin steht oder nicht.

Hier noch der Link zum Code:
https://www.androidpit.de/forum/666120/design-frage-vordefinierte-elemente-in-app-bringen#2577062

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

Can Erdener Yazar

Antworten
  • Forum-Beiträge: 57

01.04.2016, 22:54:47 via Website

Hallo Pascal,

wenn ich die Datenbank kopieren möchte, gibt der Android Studio folgende Fehlermeldung aus:

Error: (1, 1) Error: Content ist nicht zulässig in Prolog.
Error: Execution failed for task ':app:mergeDebugResources'.

E:\ERDENER\Meine\AndroidStudioProjects\Istikhara\app\src\main\res\assets\die_Datenbank.sqlite:1:1: Error: Content ist nicht zulässig in Prolog.

Weißt du was das sein könnte?

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

01.04.2016, 23:20:01 via Website

Wie hast du die Datei hinzugefügt?
Per Asset Manager oder einfach reinkopiert?

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

Can Erdener Yazar

Antworten
  • Forum-Beiträge: 57

01.04.2016, 23:27:49 via Website

In die assets Ordner habe ich einfach kopiert.
In die databases ordner sollte er mit Asset Manager selbst kopieren.

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

01.04.2016, 23:33:49 via Website

Lösch das nochmal und mach das mit dem AndroidStudio AssetImporter, vielleicht klappts dann

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

Can Erdener Yazar

Antworten
  • Forum-Beiträge: 57

02.04.2016, 00:03:56 via Website

Danke. Das Problem lag darin, dass ich die assets Ordner in die res Ordner abgelegt habe.
Anscheinend funktioniert so nicht :)

Pascal P.

Antworten

Empfohlene Artikel