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.
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
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