SQLite Blob to Array

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • SQLite Blob to Array

    Hallo,

    ich habe folgendes Problem.
    Ich habe unter Java eine SQLite Datenbank aufgebaut welche ich unter IOS auslesen möchte.

    In der Datenbank ist eine Table welche BLOBs speichert, diese BLOBs sind in java byte[] arrays.
    Nun möchte ich unter IOS diese wieder in ein Array einlesen sodass ich dann quasi über [array objectAtIndex:i] das i-te Byte erhalte.
    Leider sind alle meine Versuche gescheitert und ich komme absolut nicht weiter.
    Momentan habe ich das BLOB in ein NSData Objekt eingelesen.
    Ich hoffe jemand weiß rat und kann mir dabei helfen....


    Viele Grüße
    Marc




    Quellcode

    1. if(!isOpened)
    2. [self openDatabase];
    3. NSMutableArray *compCodes = [[NSMutableArray alloc] init];
    4. sqlite3_stmt *statement;
    5. NSString * queryString = [NSString stringWithFormat:@"SELECT PICTURE FROM picture_table AS A INNER JOIN picture_identity_table AS B WHERE B.PERSON_ID ='%i' AND A.PICTURE_ID = B.PICTURE_ID",idInt];
    6. char *query = [queryString UTF8String];
    7. if(sqlite3_prepare_v2(database, query, -1, &statement, 0) == SQLITE_OK) {
    8. while(sqlite3_step(statement) == SQLITE_ROW) {
    9. int len = sqlite3_column_bytes(statement, 0);
    10. NSData * imgData = [[NSData alloc] initWithBytes:sqlite3_column_blob(statement, 0) length:len];
    11. NSArray * entry = //CREATE Byte Array from imgData ?!?!
    12. [compCodes addObject:entry];
    13. }
    14. }
    15. sqlite3_finalize(statement);
    16. return [compCodes autorelease];
    Alles anzeigen
  • Die Bytes sind ja nur im NSData Objekt weil ich mir nicht anders zu helfen wusste :)
    Ich habe in Java das byte[] Array in die Datenbank geschrieben und kann es in java auch direkt aus der Datenbank in ein byte[] array auslesen.
    Nun suche ich halt nach einer Möglichkeit dieses Array auch in meiner IOS App auszulesen.
    Ich brauche die einzelnen Bytes, weil ich damit weiterarbeiten muss.

    Habe es gerade mit getBytes: len: auf dem NSData Objekt versucht, hab es aber nicht hinbekommen damit
  • Ich muss Byte für Byte durchgehen und jedes Byte in Booleans umwandeln, dabei erhalte ich aus einem Byte -> 7 Booleans z.b. 100 steht für 1100100 (da 64+32+4=100)
    Insgesamt erhalte ich 30002 Booleans aus einem NSData Objekt.
    Diese Booleans repräsentieren Masken, welche ich dann Pixelweise miteinander vergleiche.

    Vielleicht noch vorab eine andere Frage dazu:
    Ich habe gerade gesehen, dass der CFMutableBitVector sehr sehr sparsam ist, wenn sich dieser auch für einen performanten Vergleich mit einem anderen CFMutableBitvector eignet dann wäre das vielleicht eine überlegung wert sofern ich diesen irgendwie in eine SQLite Datenbank reinbekomme?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von eratical ()

  • ich versteh dich nicht so ganz.

    du bekommst ja direkt von sqlite die daten. ub du die nun als char[] oder UInt8[] oder UInt16[] interpretierst ist ja komplett egal. aber die in ein NSArray zu packen wäre der falsche weg. wenn es dir um die bits geht dann verwende doch wirklich CFBitVectorCreate. dort kannst du direkt die data angeben die aus sqlite kommt. musst halt aufpassen wie die daten vorliegen (The bit indices are numbered left-to-right with 0 being the left-most, or most-significant, bit in the byte stream.)

    abspeichern kannst das ganze dann logisch auch wieder. zb mit CFBitVectorGetBits kommst du an die daten
  • Ok das klingt doch schon einmal gut.
    Der Umweg mit dem CFBitVector würde ich nur im Notfall gehen.
    Wenn du mir zeigst wie ich die Daten von SQL in ein uint8[] reinbekomme und wie ich dann Byte für Byte durchlaufen kann wären meine Probleme gelöst


    LG Marc
  • Hallo danke für die Antwort.
    Es hat hervorragend geklappt und ich habe nun meine Bool-Werte wieder ;)
    Leider habe ich sogut wie keine Ahnung von den CF Datentypen und habe jetzt noch ein Problem....

    Ich habe mir aus den Bytewerten meine Booleans zurückgeholt und diese in einen CFBitVector gespeichert weil dies anscheinend die einzige ressourcenschonende Möglichkeit ist eine sehr große Menge an Booleans zu speichern.
    Wie bekomme ich denn sagen wir mal 100 CFMutableBitVector in ein Array herein?


    LG Marc
  • wenn du wirklich die CFBitVectoren in ein array packen willst dann kannst du die einfach in ein NSArray bzw CFArray werfeden. ich denke aber dass du eher 100 bit aus einem vektor willst. dazu verwendest du zb CFBitVectorGetBits.

    und nein, es ist nicht die einzige möglichkeit. du kannst anstatt dem CFBitVector auch einfach das C-array rumschleppen und dann jeweils das bit rausfischen das du brauchst.

    btw: ich hoffe du hast nicht die bytewerte in booleans konverteirt und dann in den CFBitVector sondern direkt.

    das wars aber von mir - bin eine woche in urlaub ;)
  • Danke und ich wünsche dir einen schönen Urlaub.

    Ich habe 100 CFBitVectoren mit jeweil 30000Bit, und ich muss alle parat haben um einen Vergleich mit einem einzigen 30000Bit Vector ausgeben zu können.

    Ich habe jetzt den BitVector in ein NSArray gepackt bin mir nur nicht sicher ob das so in Ordnung geht oder ob ich da groben Unufg treibe...

    Quellcode

    1. CFMutableBitVectorRef bitVec = CFBitVectorCreateMutable(Null,30000);
    2. //OPERATIONEN AUF DEM BITVECTOR
    3. NSMutableArray * vectorArray = [NSMutableArray alloc] init];
    4. [vectorArray addObject: [NSValue valueWithPointer: bitVec]];
    5. //Um wieder drauf zuzugreifen:
    6. CFMutableBitVectorRef bitVec2 = [[vectorArray objectAtIndex:0] pointerValue];



    EDIT:

    Hab es mit dem BitVector nicht hinbekommen aber habe es jetzt mit einem BOOL * array gemacht. Da verbrauche ich zwar 1Byte für 1Bool aber naja so klappt es wenigsten :)
    Von der performance her ist es jetzt nicht gut aber auch nicht schlecht. Ich brauche 1.4ms für einen Vergleich von 30000Booleans.
    Auf Android (P990 mit Dual Core) ist es ohne Parallelisierung etwas schneller ca 1.2ms


    Was mich noch brennend interessiert: Wäre es denn schneller wenn ich es mit dem BitVector hinbekommen würde ?



    LG Marc

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von eratical ()