Spezielle SQLite Order anfrage für android

  • Antworten:12
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 124

01.04.2016, 18:54:16 via Website

Hallo zusammen.

Ich stecke ein bisschen in einem dilema. und zwar habe ich in einer Datenbank tabelle mehrere Tabellen, davon muss ich nun drei zellen gleichzeitig abfragen können, um dementsprechend diese zu ordnen. (Das ganze dann vier mal), ich will aber nur wissen wie, und ob dies möglich ist.

Ich habe z.b. die Zellen :
vonLinks,
breite,
vonRechts,
hohe.

Diese drei dienen zur vermassung gewisser rand ausschnitte, also soll heissen, mann kann von links her messen oder von rechts, breite wird immer belegt.

Nun soll das ganze in einer zeichnung enden in canvas mit x,y Coordinaten. jetzt ist es aber wichtig das es immer von links (uhrzeigersinn) ausgelesen wird.

z.b.
objektgrösse 1000.

erster ausschnitt:
von Links = 300,
breite 200

zweiter ausschnitt;
von rechts 200,
breite 200.

Also auschnitt 1 soll zuerst ausgelesen werden, danach erst ausschnitt 2.

Das ist wichtig da ich für jeden eckpunkt eine x,y Coordinate brauche und um diese Punkte dann im Android zu greifen und manuell zu verschieben oder gar löschen, für die zeichnung selbst währe es nicht einmal alzutragisch. Das resultat endet dann in dieser zeichnung, (http://www.amstelmenia.ch/data-glas/pdf/image/index.php?pdf=true&id_objekt=80) und da ist es wichtig das es schön dem Urzeigersinn entlang ausliesst für das füllen der Farbe.

Meine English Kentinsse sind nach drei Jahren Programmieren, immer noch nicht gut genug um diese frage auf english zu googeln, deshalb versuch ichs hiermal :)

— geändert am 01.04.2016, 18:55:54

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

01.04.2016, 19:05:03 via Website

Möglich ist es auf jeden Fall.
ich frage mich gerade nur an was es bei dir scheitert, denn so kompiziert ist das nicht.

Leider muss ich auch sagen, dass man die Struktur der DB/Tabelle anders hätte wählen können, dann hättest du einfach nur Sortieren müssen.
Kannst/Willst du die Struktur noch ändern?
Bzw. sind alle 3 Zellen der Tabelle immer ausgefült:

vonRechts:300
breite:200
vonLinks: 100

Oder sind immer nur 2 Zellen gefüllt?
Wenn nur 2 Zellen gefüllt sind, dann wäe es besser die Struktur zu ändern, sind aber alle gefüllt hast du kein Problem ;)

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

Volkan Aydin

Antworten
  • Forum-Beiträge: 124

01.04.2016, 19:47:29 via Website

das problem an der Struktur ist eben.das diese viel zu viele Zellen enthält, so kann man auch das lichtmass etc verändern. siehe selbst :)

"rand_o",
"rand_r",
"rand_u",
"rand_l",
"ecke_or",
"ecke_ur",
"ecke_ul",
"ecke_ol",
"min_seiten_abstand",
"abstand_o",
"abstand_r",
"abstand_u",
"abstand_l",
"lange_o",
"lange_l",
"lange_u",
"lange_r",
"abstand_oben_r",
"abstand_oben_l",
"abstand_rechts_o",
"abstand_rechts_u",
"abstand_unten_l",
"abstand_unten_r",
"abstand_links_o",
"abstand_links_u",
"durchmesser",
"mindurchmesser",
"maxdurchmesser",
"fdurchmesser",
"radius",
"minradius",
"maxradius",
"fradius",
"min_abstand_querschnitt",
"abstand_q_o",
"abstand_q_r",
"abstand_q_u",
"abstand_q_l",
"lange",
"min_lange",
"max_lange",
"festelange",
"breite",
"min_breite",
"max_breite",
"festebreite",
"lm_o",
"lm_u",
"lm_l",
"lm_r",
"beschlag",
"id_beschlag",
"id_triangle",
"triangle_x",
"triangle_y",

diese Parameter enthalten hier auch noch überprüf felder.....

Das problem ist die eingabe dieser parameter, manchmal misst man von rechts, manchmal von links, manchmal ist es in der ecke, dann am rand, manchmal auch innerhalb eines Objekts, dazu kommt noch das man auf verschiedene arten etwas ausmessen muss, mit dem app bin ich eigentlich fertig ( so dachte ich) aber die zeichnung zeigt eine durchgehende linie bei den oberen zwei ausschnitten, die daherrühren das zuerst der rechte gezeichnet wird, dann der linke....

Siehe link.... im app klickt man sich durch, dann erscheinen nur die gewünschten Parameter zur eingabe, das sind diese Zellen ;) nun habe ich bei der eingabe fehlerüberprüfung die aufgabe, das nur die gewünschten parameter abgespeichert werden, und der Rest wird auf 0 gesetzt, so kann ich bei der auslese genau diese parameter in die Zeichnung übertragen, das Problem an rand ausschnitten ist aber, das man eine fortlaufende linie bilden muss, die sich dann zum einzelnen fertigem Objekt abschliessen, ausschnitte darzustellen ist kein problem und kann willkürlich ausgelesen werden, der Rest fängt oben links an ( sofern feld "ecke_or" überall 0 ist ), nur habe ich dabei nicht bedacht das nun das Problem besteht das die ränder sortiert ausgelsen werden müssen.

Ich bring einfach diesen sql befehl nicht hin ( geistlich!) ich finde nirgends ein ähnliches problem, da ich es ja nicht richtig googeln kann! :)

— geändert am 01.04.2016, 19:49:20

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

01.04.2016, 20:01:07 via Website

Ok, langsam verstehe ich dein Problem,
aber warum sql Fehler?
Wie liest du die Daten aus?
Per Cursor wahrscheinlich oder?
Wenn ja dann schreib dir die Daten in eine Liste und gehst dann die iste durch.
Dann musst du halt prüfen, welcher deienr Felder gesetzt sind.

Pseudocode:
If(cloumnVonRechts!=null && clumnVonRechts!=0)
{
//Zeichnung scheint von rechts zu beginnen.
}

Ich vermute per Code lässt isch das einfer lösen als per SQL.

Zudem unabhängig von deinem Problem hätte ich nicht Spalen "vonRechts" bzw. "vonLinks" gemacht sondern ein DirectionFeld in welchem dann immer drinsteht "right" bzw. "left" und halt die entspechende Value extra.
Da hättest du in SQL auch die möglichkeit, das auszuwerden.
Abe das tut nichs zur sache, denn deine Stuktur wird schon einen Sinn haben, zudem kenne ich dein prjekt ja nur zu einem Bruchteil um das passend bewerten zu können ;)

Ich hoffe der Denkanstoß dass per Code zu lösen hilft dir.

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

Antworten
  • Forum-Beiträge: 124

01.04.2016, 20:38:51 via Website

ok... ... ich habe eben gehofft, ich kann daraus einfach einen sql code machen anstatt wieder dutzende functionen ;)

Es sind natürlich zwei Tabellen, die eine mit den gewünschten Elementen wie einfachen ausschnitten oder Auschnittgruppen.

Die zweite Tabelle speichert dann die eingaben, und kann aus der anderen Tabelle herleiten welche Funktionen für dieses Element überhaupt verfügbar sind.

— geändert am 01.04.2016, 20:42:00

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

01.04.2016, 20:53:29 via Website

Du könntest es auch im SQL machen, dafür musst du dann aber deine Query einzeln aufrufen.

Du könntest dir ja die Columns dynamisch umortieren lassen, aber das geht dann nur, wenn du eine Row Selectest, deswegen eher ungeeignet

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

Volkan Aydin

Antworten
  • Forum-Beiträge: 124

01.04.2016, 20:57:17 via Website

eben das ist es ja... kann man bei einer sql abrage nicht mehrere Columns vergleichen mit ifs etc... ich bin bei sql eben nicht ganz sattelfest !! :)

bezüglich umsortieren lassen.... das wollte ich zu beginn.So das automatisch alle Felder nach der eingabe ausgefüllt werden, das ist aber nicht möglich, da man ja danach bei änderungen wissen will was man eingegeben hat, und nicht alle möglichen zahlen, nur bei änderung der masseinheit wird automatisch umgerechnet, so das dieses Feld dann bereits das bereits vorhandene ausgerechnete Mass anzeigt...

— geändert am 01.04.2016, 21:06:07

Antworten
  • Forum-Beiträge: 124

02.04.2016, 15:11:13 via Website

ich lass das thema noch ein zwei wochen offen, aber ich denke du hast mir schon mal geholfen.... anscheinend gibt es ja wirklich nichts für sqlite ;)

Pascal P.

Antworten
  • Forum-Beiträge: 124

03.04.2016, 16:13:46 via Website

Ich habe nun gemüdlich versucht eine zweidimensionalle Array zu erstellen, die mir das ganze Sortiert, um danach diese per ID der reihe nach aufzurugfen. Leider schaffe ich es nicht!, es gibt anscheinend soviele möglichkeiten, nur weiss ich nun nicht mehr was das beste für mich ist. und die die ich versucht habe taugen nichts .

Folgendes habe ich nun

String[][] list = new String[20][20];
    int c = 0;
    do{
        if(db.ifNotNull(db.Float(dbSchleiferei, dbf.Schleiferei.rand_o))){
            list[c][0]= db.string(dbSchleiferei, dbf.Schleiferei.sid);
            list[c][1]=Float.toString(ausAbstandL);
            c++;
        }
    }while(dbSchleiferei.moveToNext());

    Arrays.sort(list, new ColumnComparator(1));

Und hier der Code, von dem ich dachte, der sollte doch ganz einfach funktionieren

class ColumnComparator implements Comparator {
int columnToSort;
ColumnComparator(int columnToSort) {
    this.columnToSort = columnToSort;
}
//overriding compare method
public int compare(Object o1, Object o2) {
    String[] row1 = (String[]) o1;
    String[] row2 = (String[]) o2;
    //compare the columns to sort
    return row1[columnToSort].compareTo(row2[columnToSort]);
}

}

columnToSort steht doch für die zu sortierende Zelle? ( also die zweite). Was verstehe ich hier nicht? :)

Ich bekomme immer diesen Fehler und habe keine ahnung wo das Problem liegt:

04-03 16:04:14.230: E/AndroidRuntime(9500): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.awad.awad_glasrechner/com.awad.awad_glasrechner.Objekte.ObjektTriangle}: java.lang.NullPointerException
04-03 16:04:14.230: E/AndroidRuntime(9500):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
04-03 16:04:14.230: E/AndroidRuntime(9500):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
04-03 16:04:14.230: E/AndroidRuntime(9500):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
04-03 16:04:14.230: E/AndroidRuntime(9500):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
04-03 16:04:14.230: E/AndroidRuntime(9500):     at android.os.Handler.dispatchMessage(Handler.java:102)
04-03 16:04:14.230: E/AndroidRuntime(9500):     at android.os.Looper.loop(Looper.java:136)
04-03 16:04:14.230: E/AndroidRuntime(9500):     at android.app.ActivityThread.main(ActivityThread.java:5021)
04-03 16:04:14.230: E/AndroidRuntime(9500):     at java.lang.reflect.Method.invokeNative(Native Method)
04-03 16:04:14.230: E/AndroidRuntime(9500):     at java.lang.reflect.Method.invoke(Method.java:515)
04-03 16:04:14.230: E/AndroidRuntime(9500):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827)
04-03 16:04:14.230: E/AndroidRuntime(9500):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643)
04-03 16:04:14.230: E/AndroidRuntime(9500):     at dalvik.system.NativeStart.main(Native Method)
04-03 16:04:14.230: E/AndroidRuntime(9500): Caused by: java.lang.NullPointerException
04-03 16:04:14.230: E/AndroidRuntime(9500):     at com.awad.awad_glasrechner.Objekte.ColumnComparator.compare(ObjektTriangleCreat.java:1536)
04-03 16:04:14.230: E/AndroidRuntime(9500):     at java.util.TimSort.countRunAndMakeAscending(TimSort.java:320)
04-03 16:04:14.230: E/AndroidRuntime(9500):     at java.util.TimSort.sort(TimSort.java:185)
04-03 16:04:14.230: E/AndroidRuntime(9500):     at java.util.TimSort.sort(TimSort.java:169)
04-03 16:04:14.230: E/AndroidRuntime(9500):     at java.util.Arrays.sort(Arrays.java:2023)
04-03 16:04:14.230: E/AndroidRuntime(9500):     at com.awad.awad_glasrechner.Objekte.ObjektTriangleCreat.creatO(ObjektTriangleCreat.java:444)

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

03.04.2016, 21:04:28 via Website

Ohne das selber zu debuggen kann ich dazu nich viel sagen..

Der Ansatz sieht garnicht schlecht aus,
aber welche Zeile Ist denn das:
ObjektTriangleCreat.java:1536 ?

Da tritt der Fehler auch und irgend ein Objekt ist NULL im Comparator.
Vielleciht musst du vorher auf !=null prüfen und diese Fälle entspechend behandeln.

Zudem vergleichst du nur eine Spalte also die ColumnToSort, ich dachte du wolltest Spaltenübergreifend sortieren.

Ich persönlich bin ein Freund von OOP, wenn ich DB Abfragen mache, werde ich das Ergebnis aus und schreibe mir die Werte in ein Objekt.
Habe ich mehrere TableRows dann nehme ich eine ArrayList dieses Objekts.

So wenn ich jetzt sortieren will, schreibe ich mir einen Sortieralgoritmus, welcher die liste durchgeht, und sie anhand bestimmter kriterien durchsucht. z.b alle Objekte bei welchen Property1!=null sind dann ganz oben etc..

Aber da ist OOP, also ganz anders als bei dir.

Nach deiner möglcihkeite müsste es auch gehen, die Frage ist nur, wie du dir das gedacht hast=
Erstmal nach eine Column sortieren und dann weiter nachdenken (thinking)

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

Antworten
  • Forum-Beiträge: 124

09.04.2016, 17:45:07 via Website

Also... erstmal sorry, für meine verspätete reaktion!, ich habe die ganze woche gebraucht um diese Formel nun zu perfektionieren :)..

das Problem an diesem Fehler war eben, das sie(ObjektTriangleCreat.java:1536) nur auf eine Funktion zeigte, nicht was darin null ausgab... nun habe ich meine hausaugaben gemacht und wie folgt gelöst.

dbSchleiferei.moveToFirst();

    List<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
    do{
        if(db.ifNotNull(db.Float(dbSchleiferei, dbf.Schleiferei.rand_r))){
            iniVariable();
            list.add(new ArrayList<Integer>(Arrays.asList((int)ausAbstandO,db.Int(dbBestellSchleiferei, dbf.bestell_Schleiferei.sid))));

        }
    }while(dbBestellSchleiferei.moveToNext());

    Collections.sort(list, new Comparator<ArrayList<Integer>>() {    
            @Override
            public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
                return o1.get(0).compareTo(o2.get(0));
            }               
    });

    for(int i=0;i<list.size();i++){
        String s = list.get(i).toString();
        String[] sp = s.split(", ");
        String spId = sp[1];
        spId = spId.replace("]","");

        dbSchleiferei = db.whileQuery(dbf.Schleiferei.table, dbf.where(dbf.Schleiferei.sid, spId));


            iniVariable();
            if( creatR1()){
                if(creatR2()){
                    if(creatR3()){
                        if(creatR4()){

                        bRandR = true;
                        }
                    }
                }
            }



        }
        loadDbSchleiferei();

        return bRandR;

Die Variable ausAbstandO, enthält immer den wert Y der errechnet wurde (iniVariable();) aus mehreren Spalten , der Tabelle, genau das was ich eigentlich eben in einem query machen wollte... :)

Das Problem weshalb ich es anders gelöst habe, ist die möglichkeit allermöglichen ausfrässungen etc einfach zu implementieren, hat zwei Jahre gedauert (also das ganze projekt) aber es scheint langsam in richtung ende zu gehen :)

hier mein aktuelles Objekt an der ich arbeite.
http://www.amstelmenia.ch/data-glas/pdf/image/index.php?pdf=true&id_objekt=89

Und das ist nur ein teil der fertigen PDF :) Das ich soweit gehe und eine Complett taugliche CAD Zeichnung erstellen will, war nie geplant :)

Vielen Dank nochmals für die Zeit und für die Hilfe!

— geändert am 09.04.2016, 17:47:28

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

09.04.2016, 17:48:32 via App

Hallo Volkan!

Super, wenn deine Frage geklärt ist, setze doch bitte noch deinen Thread auf "Beantwortet"!

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

Antworten

Empfohlene Artikel