2017-04-17 9 views
0

Die App speichert Daten in vielen verschiedenen Kategorien, jede Kategorie hat ihre eigenen db. Wenn Sie zwischen Kategorien wechseln, schließen/öffnen Sie eine neue db.iOS 10.3 kann nicht geöffnet werden sqlite db

Problem: Einige dieser DBs können nicht von SQLite geöffnet werden, andere funktionieren wie erwartet mit dem exakt gleichen Code.

Auch dieses Problem begann nach dem neuesten Update (iOS 10.3).

-(NSString *) filePath { 
    NSString *appGroupId = @"xxx.xxx.extension"; 
    NSURL *appGroupDirectoryPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:appGroupId]; 
    NSURL *dataBaseURL = [appGroupDirectoryPath URLByAppendingPathComponent:_detailItem]; 
    NSString *paths = dataBaseURL.path; 
return paths; 
} 

DB öffnen:

Get Pfad zur Datei

-(void)openDB { 
    if (sqlite3_open([[self filePath] UTF8String], &db) != SQLITE_OK) { 
     sqlite3_close(db); 
     NSLog(@"error"); 
    } 
    else{ 
     NSLog(@"Opened"); 
    } 
} 

Alle db eröffnet werden diesen Code verwenden, ist nur die Dateinamen Unterschied. Die meisten Dateinamen enthalten Sonderzeichen wie å ä ö.

Filenames/DB Names: 
ma värd 
ga väg A4 

-Beide Dateien befinden sich im selben Ordner.

-Beide Dateien enthält Daten, einige Spalten sind sogar identisch.

-Beide sind mit gleichen Code erstellt

Beim Versuch, die erste, die ich eine leere DB-Datei zu erhalten Zugriff auf alle SELECT-Anweisungen gibt „keine solche Tabelle: table_name“

Beim Versuch, die zweite für den Zugriff auf Eins funktioniert alles wie erwartet.

Eine von vielen SELECT-Anweisungen:

-(NSString *)antalAsString:(NSString *)typAvAntal { 

    NSString *antalMatt = [[NSString alloc] init]; 
    NSString *sql = [NSString stringWithFormat:@"SELECT sum(antal) FROM '%@'", typAvAntal]; 
    sqlite3_stmt *statement; 
    NSLog(@"sql string: %@", sql); 

    const char *err; 
    if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, &err)==SQLITE_OK) 
    { 
     while (sqlite3_step(statement)==SQLITE_ROW) { 
      char *antal = (char *) sqlite3_column_text(statement, 0); 
      if (antal != NULL) { 
       antalMatt = [[NSString alloc]initWithUTF8String:antal]; 

       //.... 


       } 
      } 

     } 

    else { 
     NSLog(@"error: %s", sqlite3_errmsg(db)); 
    } 

    sqlite3_finalize(statement); 

    return antalMatt; 
} 

Wie ist das möglich? Hat sich etwas in SQLite mit iOS 10.3 geändert?

EDIT/UPDATE:

Sah im Ordner jede Datei durch, mit NSArray/NSLog und sah, dass alle Dateinamen mit Sonderzeichen in ein anderes Format dupliziert wurden.

Diese 2-Dateien:

Filenames/DB Names: 
ma värd 
ga väg A4 

Sind diese 4-Dateien werden:

ma va\U0308rd 
ma v\U00e4rd 

ga va\U0308g A4 
ga v\U00e4g A4 

Wenn ich versuche, die Dateigröße von "ma va \ U0308rd" zu überprüfen, wird die Zeichenfolge umgewandelt in " ma värd "und ich bin mir nicht sicher, auf welche der beiden verwiesen wird.

NSString *sourcePath = [self filePath]; 

NSFileManager *fm = [NSFileManager defaultManager]; 
NSError *Error = nil; 
NSArray *sourceFiles = [fm contentsOfDirectoryAtPath:sourcePath error:&Error]; 
int i = 0; 
for (NSString *currentFile in sourceFiles) 
{ 
    if ([fm fileExistsAtPath:[sourcePath stringByAppendingPathComponent:[sourceFiles objectAtIndex:i]]]) 
    { 
     if ([currentFile hasPrefix:@"ma"]) 
     { 

     unsigned long long fileSize = [[fm attributesOfItemAtPath:[sourcePath stringByAppendingPathComponent:[sourceFiles objectAtIndex:i]] error:nil] fileSize]; 

      NSLog(@"FILE: %@ _______ SIZE: %llu", [sourceFiles objectAtIndex:i], fileSize); 
     } 
    } 
    else { 
     NSLog(@"NO FILE EXISTS: %@", currentFile); 

    } 
    i = i+1; 
} 

Viele Fragen:

Warum das Update hat Duplikate erstellen?

Welche Datei wählt der Dateimanager?

Welchen Sqlite wählt man?

Gibt es eine Möglichkeit, "ma va \ U0308rd" als NSString zu deklarieren, ohne dass es in "ma värd" konvertiert wird?

Hilfe ist willkommen.

+0

Wahrscheinlich ist es wegen [APFS] (https://9to5mac.com/2017/03/21/what-is-apples-upcoming-apfs-apple-file-system-and-what-it -means-to-you /) eingeführt in iOS 10.3 – phi

+0

Ja, Sie haben wahrscheinlich Recht, die Dateien scheinen völlig unerreichbar und nicht in der Lage zu sichern. Muss den gesamten Ordner löschen, wobei alle Daten verloren gehen – Niklas

Antwort

0

Ich habe keine Ahnung, warum das Update Duplikate jeder Datei im App-Gruppenordner erstellt hat. Aber gelernt, dass es eine Möglichkeit gibt zu steuern, welche Unicode-Form mit Sonderzeichen verwendet wird. Es scheint, dass, wenn nicht angegeben, das System entweder ein zufälliges auswählt oder die erste Datei auswählt, die es findet, egal welche Form es hat.

Apple-Dokumentation:

> decomposedStringWithCanonicalMapping A string made by normalizing the 
> string’s contents using the Unicode Normalization Form D. 
> 
> decomposedStringWithCompatibilityMapping A string made by normalizing 
> the receiver’s contents using the Unicode Normalization Form KD. 
> 
> precomposedStringWithCanonicalMapping A string made by normalizing the 
> string’s contents using the Unicode Normalization Form C. 
> 
> precomposedStringWithCompatibilityMapping A string made by normalizing 
> the receiver’s contents using the Unicode Normalization Form KC. 

zerlegt - verwendet Sequenzen von Zeichen (a + \ U0308 = ä)

precomposed - verwendet eindeutigen Code für jedes Zeichen (\ U00e4 = ä)

War in der Lage, alle Daten zu speichern, indem Sie zwischen diesen umschalten, um auf die realen db-Dateien zuzugreifen und die erstellten "Dummies" zu löschen.

-(NSString *) filePath { 
     NSString *appGroupId = @"xxx.xxx.extension"; 
     NSURL *appGroupDirectoryPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:appGroupId]; 
     NSURL *dataBaseURL = [appGroupDirectoryPath URLByAppendingPathComponent:_detailItem]; 
     NSString *paths = dataBaseURL.path.decomposedStringWithCompatibilityMapping; 

    return paths; 
    } 
Verwandte Themen