Я отправляю файл SQLite (файл Coredata sqlite) по электронной почте, но обнаружил пустые данные во всех таблицах в полученном письме.
Я использую код ниже:
MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init];
mc.mailComposeDelegate = self;
[mc setSubject:subject];
[mc setMessageBody:body isHTML:FALSE];
if (attachmentData) {
[mc addAttachmentData:attachmentData mimeType:fileMimeType fileName:fileName];
}
if (!recipients || recipients.count == 0) {
recipients = @[];
}
[mc setToRecipients:recipients];
[presentedViewController presentViewController:mc animated:YES completion:nil];
Here, fileMimeType = "application/x-sqlite3" and fileName: xyz.sqlite
Здесь нашел тот же вопрос, но без решения. Любая идея, как это сделать?
Да, я отправляю только файл SQLite. Позвольте мне отправить файл WAL и проверить.
Здорово! используя файл WAL, он работает. Получил все данные. Спасибо, @pbasdf. Пожалуйста, опубликуйте свой ответ ниже, чтобы я мог принять.





Этот тестовый код, похоже, отлично работал для меня с отправкой простой пробной базы данных:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self sendSampleMailWithDbAttached];
}
- (void)sendSampleMailWithDbAttached {
MFMailComposeViewController *mc = [[MFMailComposeViewController alloc] init];
mc.mailComposeDelegate = self;
[mc setSubject:@"Message Subject"];
[mc setMessageBody:@"Message Body" isHTML:NO];
NSString *sqliteFilePath = [self createTestDb];
NSData *attachmentData = [NSData dataWithContentsOfFile:sqliteFilePath];
if (attachmentData) {
[mc addAttachmentData:attachmentData mimeType:@"application/x-sqlite3" fileName:@"xyz.sqlite"];
}
[mc setToRecipients:@[@"[email protected]"]];
[self presentViewController:mc animated:YES completion:nil];
}
- (NSString *)createTestDb {
NSString *databasePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
stringByAppendingPathComponent: @"xyz.sqlite"];
sqlite3 *db;
if (sqlite3_open([databasePath UTF8String], &db) == SQLITE_OK) {
NSString *query = @"CREATE TABLE IF NOT EXISTS test(abc TEXT, def TEXT);";
if (sqlite3_exec(db, [query UTF8String], NULL, NULL, NULL) == SQLITE_OK) {
query = @"INSERT INTO test(abc, def) VALUES('ABC', '123');";
}
sqlite3_close(db);
}
return databasePath;
}
Да, 1) файл БД не равен нулю, 2) длина файла вложения: Actaul составляет 238 КБ, но при извлечении с использованием 3-й точки найдено 160 КБ 3) NSURL *sqliteURL = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject ] URLByAppendingPathComponent:@"xyz.sqlite"]
Я использую Coredata.
Я попробовал ваш код, но он отлично работает с SQLite DB, но не с Coredata.
Как я указал в комментариях, iOS по умолчанию использует режим SQLite WAL, поэтому вам нужно включить файл WAL в качестве вложения.
Вы отправляете только файл .sqlite? iOS по умолчанию использует режим WAL, поэтому вам также потребуется отправить файл WAL.