App läuft auf Emulator und hängt auf dem Smartphone beim DatabaseHelper

  • Antworten:9
Markus V.
  • Forum-Beiträge: 8

31.10.2017, 17:21:09 via Website

Hallo zusammen,

meine erste App läuft auf dem Emulator. Auf meinem Smartphone bleit sie hängen. So weit ich aus dem Protokoll entnehmen kann, an der Stelle an der ich einen SQL Befehl an die SQLite Datenbank sende.

com.example.markus.blood.DatabaseHelper.getListFood(DatabaseHelper.java:104)

 public List<Food> getListFood(){
        Food food = null;
        List<Food> foodList = new ArrayList<>();
        openDatabase();
        Cursor cursor = mDatabase.rawQuery("select id, DE, "+ this.xselect+" from Lebensmittel where foodid = '"+ this.text1 +"'", null);
        cursor.moveToFirst();
        while (!cursor.isAfterLast()){
            food = new Food(cursor.getInt(0), cursor.getString(1), cursor.getInt(2), cursor.getInt(3), cursor.getInt(4));
            foodList.add(food);
            cursor.moveToNext();
        }
        cursor.close();
        closeDatabase();
        return foodList;
    }

bzw.

com.example.markus.blood.SelectionActivity.onCreate(SelectionActivity.java:88)

mFoodList = mDBHelper.getListFood();

Bin für ernstgemeinte Tipps dankbar, gerne auch via Skypecall.

Gruß
Markus

Antworten
swa00
  • Forum-Beiträge: 3.704

31.10.2017, 17:54:28 via Website

Hallo Markus,

"bleibt sie Hängen" ist nicht so der Brüller, womit wir was Effektives anfangen könnten :-)

I.d.R gibt es bei so etwas den ErrorLog in AS.
Der gibt dann auch schön aus , was nicht gepasst hat .

Ich vermute mal stark , dass du entweder keine Zugriffsrechte auf dem Device hast (Permission Request)
oder schlichtweg die Initialisierung nicht sauber umgesetzt hast.

Wäre also gut , wenn du den Log hier posten könntest .

P.S Food & Blood - Vampir zu Halloween ? :-)

— geändert am 31.10.2017, 17:58:29

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Markus V.
  • Forum-Beiträge: 8

31.10.2017, 18:08:14 via Website

Hallo Stefan,

ich bin nun etwas weiter gekommen. Mein Problem liegt hier drin:

Cursor cursor = mDatabase.rawQuery("select id, DE, "+ this.xselect+" from Lebensmittel where foodid = '"+ this.text1 +"'", null);

Wenn ich es so umstelle läuft es:

Cursor cursor = mDatabase.rawQuery("select id, DE, btng, btnn, btns from Lebensmittel where foodid = '"+ this.text1 +"'", null);

Die Variable xselect fülle ich über eine Switch Case Anweisung:

switch (text2){
            case "Type 0":
                xselect = "btng, btnn, btns";
                break;
            case "Type A":
                xselect = "btag, btan, btas";
                break;
            case "Type B":
                xselect = "btbg, btbn, btbs";
                break;
            case "Type AB":
                xselect = "btabg, btabn, btabs";
                break;
        }

Der hintere Teil mit "this.text1" funktioniert.

Gruß
Markus

Antworten
Klaus T.
  • Forum-Beiträge: 8.183

31.10.2017, 18:46:52 via Website

Mmmh...ich würde auf jeden Fall auch einen default in den switch machen. Wenn nix aus deinem switch zutreffen sollte...was steht dann in xselect drin? Wenn das dann z.B. leer ist, ist das sql-Statement fehlerhaft.... (thinking)

Wie Stefan schon schrieb...im Log sollte aber was zielführendes zu lesen sein.

if all else fails, read the instructions.

Antworten
Markus V.
  • Forum-Beiträge: 8

31.10.2017, 19:08:21 via Website

Hallo Klaus,

in der Variable sql1 habe ich jetzt den kompletten Select-String drin. Wie du siehst, ist der Toast korrekt geschrieben und du siehst auch, dass im Emulator die Abfrage ausgeführt und das Ergebnis angezeigt wird.

String sql1 = xselect;
Toast.makeText(mContext, sql1, Toast.LENGTH_SHORT).show();
Cursor cursor = mDatabase.rawQuery(sql1, null);

Auf dem Smartphone steht dann "Blutgruppe angehalten" sowie "OK"

image

Und das steht im Android Monitor (Fett markiert Java 112 und Java 88) :

10-31 18:49:42.443 24765-24765/com.example.markus.blood E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.markus.blood, PID: 24765
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.markus.blood/com.example.markus.blood.SelectionActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.trim()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2689)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2754)
at android.app.ActivityThread.access$900(ActivityThread.java:177)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5938)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.trim()' on a null object reference
at android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:43)
at android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1440)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1379)
at com.example.markus.blood.DatabaseHelper.getListFood(DatabaseHelper.java:112)
at com.example.markus.blood.SelectionActivity.onCreate(SelectionActivity.java:88)

at android.app.Activity.performCreate(Activity.java:6288)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2642)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2754) 
at android.app.ActivityThread.access$900(ActivityThread.java:177) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:145) 
at android.app.ActivityThread.main(ActivityThread.java:5938) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 
10-31 18:49:42.453 765-1093/? W/ActivityManager: Force finishing activity com.example.markus.blood/.FoodActivity

Gruß
Markus

Antworten
Klaus T.
  • Forum-Beiträge: 8.183

31.10.2017, 19:25:14 via Website

Beseitige doch mal das Problem hier:

ComponentInfo{com.example.markus.blood/com.example.markus.blood.SelectionActivity}: java.lang.NullPointerException:
Attempt to invoke virtual method 'java.lang.String java.lang.String.trim()' on a null object reference

if all else fails, read the instructions.

swa00

Antworten
Markus V.
  • Forum-Beiträge: 8

31.10.2017, 20:29:35 via Website

Hallo Klaus,

als ich dir antworten wollte ist mir gerade das Problem aufgefallen und gleichzeitig die Lösung. In meiner Switch-case Anweisung Frage ich z.B. nach "Type A" eigentlich muss ich nach "Gruppe A" fragen.
Da ich gerne eine Mehrsprachige App programmieren will, ist mein Emulator Handy englisch, mein Smartphone jedoch deutsch.
Daher kommt auf dem Smartphone kein Select an.
Also theoretisch ist das Problem vom Tisch und gleichzeitig ein neues aufgetaucht.

Aus meiner Klasse Selection gebe ich mit Hilfe von SharedPreferences die zwei Texte für meine Bedingungen für die SQL Abfrage mit:

SharedPreferences myShared = getSharedPreferences("Select", 0);
SharedPreferences.Editor editor = myShared.edit();
editor.putString("Feld1", text1View.getText().toString());
editor.putString("Feld2", text2View.getText().toString());

Eigentlich müsst ich sie an dieser Stelle die Texte schon ins englische Übersetzt mitgeben. Nur wie mach ich das? In strings.xml habe ich im Standard englisch und als erste Fremdsprache deutsch.

Vielleicht kannst du mir noch diese Frage beantworten:
In meiner SQLite Datenbank habe ich die Lebensmittel in deutscher Sprache erfasst. Wenn ich die Lebensmittel auf Englisch möchte, füge ich in meiner Datenbank für jede Fremdsprache eine Spalte ein oder wie kann ich die Abfrageergebnisse in die jeweilige Fremdsprache übersetzen?

Vielen Dank im Voraus.
Gruß Markus

Antworten
swa00
  • Forum-Beiträge: 3.704

31.10.2017, 20:35:33 via Website

Hallo Markus,

Eine Mehrsprachigkeit realisiert man normalerweise mit dem Open Translate Editor
(res/values/strings.xml -> rechtsklick)

und da dann in Spalte 1 englisch.
(Entspricht auch den Standardanforderungen seitens Google)

Dann brauchst du auch nicht mit den Shares zu arbeiten
(Die verwende ich schon lange nicht mehr - alles DB orientiert)

Oder - da du ja eh schon eine DB auf hast - mach dir dazu noch eine eigene DB

— geändert am 31.10.2017, 20:44:40

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Markus V.
  • Forum-Beiträge: 8

31.10.2017, 20:58:08 via Website

Hallo Stefan,

die Übersetzungen habe ich. Und die SharedPreferences benutze ich nur um Daten von einer Klasse in eine andere zu bekommen. Das dies meine erste App ist, kann ich noch sehr vieles lernen.

image

Nur habe ich nur einen Switch-Case und der prüft auf englisch. Ich müsste jetzt den Inhalt von text1 der "Gruppe A" in "Type A" übersetzen. Nur, wie mache ich das?

Gruß Markus

Antworten
Markus V.
  • Forum-Beiträge: 8

31.10.2017, 23:21:25 via Website

Hallo zusammen,

ich habe es jetzt mal so gelöst:

xlanguage = Locale.getDefault().getDisplayLanguage();
Log.i("XLOG ", " xlanguage: " + this.xlanguage);

if(xlanguage.equals("Deutsch")) {
    switch (this.text2) {
        case "Gruppe 0":
            xselect = "select id, DE, btng, btnn, btns from Lebensmittel where foodid = '" + this.text1 + "'";
            break;
        case "Gruppe A":
            xselect = "select id, DE, btag, btan, btas from Lebensmittel where foodid = '" + this.text1 + "'";
            break;
        case "Gruppe B":
            xselect = "select id, DE, btbg, btbn, btbs from Lebensmittel where foodid = '" + this.text1 + "'";
            break;
        case "Gruppe AB":
            xselect = "select id, DE, btabg, btabn, btabs from Lebensmittel where foodid = '" + this.text1 + "'";
            break;
        }
    }

else {
    switch (this.text2) {
        case "Type 0":
            xselect = "select id, DE, btng, btnn, btns from Lebensmittel where foodid = '" + this.text1 + "'";
            break;
        case "Type A":
            xselect = "select id, DE, btag, btan, btas from Lebensmittel where foodid = '" + this.text1 + "'";
            break;
        case "Type B":
            xselect = "select id, DE, btbg, btbn, btbs from Lebensmittel where foodid = '" + this.text1 + "'";
            break;
        case "Type AB":
            xselect = "select id, DE, btabg, btabn, btabs from Lebensmittel where foodid = '" + this.text1 + "'";
            break;
    }
}

Ist zwar nicht ganz so schön, aber für den Moment läuft die App.

Gibt es im Raum Karlsruhe gleichgesinnte? Ich würde mich gerne mal austauschen.

Gruß Markus
Ty

Antworten