FileArray in Split-Blob speichern

Hi Ihr Lieben!
Ich möchte gerne ein File-Array in ein Sqlite-Blob speichern.
Ich habe in einem Array Shell-Pfade gespeichert. Diese habe ich als langen String mit EndOfLine zusammen gelegt und im Blob gespeichert.
Soweit funktioniert auch das Auslesen.
Wenn aber Umlaute im Spiel sind, gibt es beim FolderItem Probleme.
Wie kann ich die Umlaute wieder korrigieren?
Oder ist mein Ansatz völlig falsch?
Liebe Grüsse Mich D.

Bitte eine Tabelle in der Datenbank bauen.
Pfad als Textfeld.

BLOB hat ja kein Textencoding.

Danke Christian
Das werde ich versuchen, ich wusste nicht, dass man ein Textfeld mit so viel Inhalt belegen kann.
Blei schön gesund!

Sorry, aber ich habe trotzdem noch die gleichen Probleme.
Beim Auslesen sieht es immer noch so aus:
/Volumes/IronWolf 8TB/Album mit Za??hler/Berlin, 26. Dezember 2018/Fotos - 3706 von 5277.tiff?/Volumes/IronWolf 8TB/Album mit Za??hler/Berlin, 26. Dezember…
Ausserdem möchte ich diesen langen Text wieder in ein Array zurückschreiben.

Hier hast Du ein composite vs. decomposite UTF8-Problem.
Schau mal unter String comparison works on Windows but not on OSX.

Da ist Code wie die Pfade normalisiert werden können bevor (!) sie in die DB geschrieben werden.

Hi Thomas
Also, ich habe vergessen mein System anzugeben: Catalina 10.15.5 und Xojo 2019 3.1
Ich habe versucht die Funktion einzusetzen.
Leider blicke ich da nicht durch.
Habe keine Ahnung was ich als Form eingeben soll.
Vielleicht kannst Du mir da weiterhelfen?

Wie immer: wie sieht Dein Code aus? Was hast Du probiert? Wie schreibst Du und wie liest Du? Welche SQLite-Version verwendest Du? Wie ist die Datenbank definiert?

Und nein, das sieht nicht nach einem composite Problem aus, da ja keine Daten verglichen werden.

Wenn Du faul bist, kannst Du auch Deine Daten einfach base64-encoded speichern. Eine eigene Tabelle für die Pfade würde sicherlich auch Sinn machen.

Hallo Beatrix
Sqlite Version: ist die von Xojo 2019 3.1
1. Pfade suchen?
CMD="find “+f2.ShellPath+” -type f -not -path ‘/.’ -size +1000k -name ‘.mkv’ -o -name '.mp4’ -o -name ‘.wmv’ -o -name '.flv’ -o -name ‘.webm’ -o -name '.mov’ -o -name ‘.jpeg’ -o -name '.jpg’ -o -name ‘.PNG’ -o -name '.dng’ -o -name ‘.tiff’ -o -name '.ARW’ -o -name ‘.MP4’ -o -name '.JPG’ -o -name ‘.MOV’ -o -name '.CR2’ -o -name ‘*.MTS’

var sh as new shell
sh.Execute CMD
ImportFileArray = sh.Result.Split(EndOfLine) // Alle Files im Array

2.Schreiben
var DATA as string
var z as integer
for z =0 to ImportFileArray.Ubound // Array als Zeichenkette zusammen zusammenlegen
Data=Data+ImportFileArray(z)+EndOfLine '# String aus Array
next
Dim ps As SQLitePreparedStatement = DB.Prepare(“INSERT INTO ImportTabelle (Array,Pfad,Anzahl) VALUES (?,?,?)”)
ps.BindType(0, SQLitePreparedStatement.SQLITE_TEXT) 'Array
ps.Bind 0, DATA
ps.BindType(1, SQLitePreparedStatement.SQLITE_TEXT) 'Pfad
ps.Bind 1, Pfad
ps.BindType(2, SQLitePreparedStatement.SQLITE_Integer) 'Anzahl
ps.Bind 2, str(ImportFileArray.Ubound)
ps.SQLExecute
If db.Error Then
Return
End

3. Lesen
var AnArray(-1) as String
var rs as RowSet
Sq="select * from ImportTabelle“
if rs.RowCount>0 then
anArray = DATA.Split(EndOfLine) // String in Array schreiben
for i=0 to AnArray.Ubound
list.AddRow(AnArray(i))
next
end if

So sollte es sein
/Volumes/Media\ SD/TestBilder/Dänemark

So ist es leider
/Volumes/Media SD/TestBilder/Da??nemark/18062.jpg?/Volumes/Media SD/TestBilder/Da??nemark/24577.jpg?/Volumes/Media SD/TestBilder/Da??nemark/

Offensichtlich erzeugt FIND nicht korrekten Pfade, obwohl im Terminal die Pfadnamen gut aussehen aber sich mit open nicht öffnen lassen!?

Data beim Schreiben hat ein Textencoding? Kannst du im Debugger sehen bei der Variable.

Und beim Lesen wo wird da das SQL ausgeführt?
Textencoding ist da gesetzt?

Hallo Christian
Du hast recht, das rs=db.SelectSQL(sq)
habe ich nicht mit im Post reingesetzt.

So siehts Original aus:
Sq=“select * from ImportTabelle”
rs=db.SelectSQL(sq)
list.RemoveAllRows
DBListeFüllen(rs,list)

Das Auslesen funktioniert ja, aber die Pfade stimmen einfach nicht.
Was meinst Du mit Textencoding?

Versuche, DATA ein TextEncoding zu verpassen:

DATA = DATA.DefineEncoding(Encodings.UTF8)

SUPER Beatrix
Was würde ich nur ohne EUCH machen!!!
Ich wünsche Euch ein wunderschönes Wochenende
Danke

DATA = DATA.DefineEncoding(Encodings.UTF8)

Das wird immer noch zu Kummer führen!

Dateipfade sind auf dem Mac decomposite UTF8. So wird ein ein “ä” als “a¨” im String auftauchen. Im Unicude ist das zwar gleichwertig zu einem “ä”, es wird aber erfahrungsgemäß gerne mal zu Problemen bei der Verwendung führen.
Daher sollten die Pfade zuerst auf die Composite Form “normalisiert” werden.

Solange nicht sichergestellt ist, da die Daten auch als utf-8 in die DB reingeschrieben werden, ist das unvollstndig.

Also: Vor dem setzen eines Strings diesen so nach utf-8 konvertieren:

s = s.ConvertEncoding (Encodings.UTF8)

Und dann beim Lesen wieder, wie Beatrix zeigte, das Encoding wieder auf utf-8 setzen.

Thomas Eckert ist auch nicht ganz falsch, aber das ist fr die DB-Sache erstmal irrelevant. Nur, wenn du mal decomposed und mal composed strings in die DB packen wrdest, und die dann nicht als gleich erkannt wrden, wre das evtl. ein Problem. Das knnte man dadurch lsen, die ICU-Lib in sqlite nachzuladen. Dann wrde auch die Suche mit Umlauten klappen (mit G/k-Ignorierung).

Oder Thomas soll wenigstens erklren, wie man einen String am Mac (de)composed, also normalisiert. Ich wei nur von der NSURL-Funktion “fileSystemRepresentation”. MBS hat die evtl. auch mit drin. Wie wrde man dann aufrufen, um den normalisierten Pfad zu erhalten - dann kann man sich auf die Sache mit ConvertEncoding sparen.

Wobei - ich bin mir sicher, da “find” immer konsistente Namen liefert, daher ist die Normalisierung hier dann nicht ntig.

Ausserdem: Dateinamen in macOS drfen CR und LF enthalten, und CR kommt sogar teils bei alten Dateien vor (z.B. das alte “Icon”-File mit CR am Ende) - besser wre es daher, den Ouput mit dem “-0”-Option nach NUL-Chars zu trennen, und damit zu splitten. NULs drften auch im Namen vorkommen, ist aber viel unwahrscheinlicher.

Auerdem: Du schreibst anscheinend alle gefundenen Pfade in EINE DB-Zeile. Soll das wirklich so? Nicht eine Zeile pro Pfad?

Die Schleife knnte auch optimiert werden:

var z as integer for z =0 to ImportFileArray.Ubound // Array als Zeichenkette zusammen zusammenlegen Data=Data+ImportFileArray(z)+EndOfLine '# String aus Array next

Besser:

for each file as String in ImportFileArray Data = Data + file + EndOfLine next

Oder noch besser:

Data = Join (ImportFileArray, EndOfLine) + EndOfLine

In dem oben stehenden Link ist eine “Normalize” Funktion hinterlegt.Die muss einfach nur mit einem Dateipfad aufgerufen werden um dann mit “kCFStringNormalizationFormC” die composite-Form zurück zu bekommen.
Man benötigt definitiv keinen Plugin dafür!

Ah, ganz oben. Hatte ich übersehen, danke.