Я создавал приложение списка и поддерживал его базовыми данными.
Я хотел бы иметь список по умолчанию, говорят, что объекты 10 аэропортов, так, чтобы пользователь не запускал с нуля.
Там какой-либо путь состоит в том, чтобы сделать это?
Любая справка ценится.Заранее спасибо.
Это работало на меня. Это - модификация этого ответ Andrea Toso и вдохновленный этим блог . Единственная проблема с ответом - то, что существует шанс потери данных при перемещении sqlite файлов с FileManager. Я сохранил приблизительно 500 строк данных при помощи replacePersistentStore вместо шага 1
FileManager.default.copyItem
, Заполняют Ваши Базовые Данные в другом приложении и получают путь файлов с помощью этого кода:
let paths = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
print(documentsDirectory)
Step2
Перетаскивают Ваши 3 файла с .sqlite расширением в Ваш проект XCode. (Обязательно выберите, Добавляют к целевой опции).
Step3
Создает функцию для проверки первого показа приложения в Копию AppDelegate.swift
func isFirstLaunch() -> Bool {
let hasBeenLaunchedBeforeFlag = "hasBeenLaunchedBeforeFlag"
let isFirstLaunch = !UserDefaults.standard.bool(forKey: hasBeenLaunchedBeforeFlag)
if (isFirstLaunch) {
UserDefaults.standard.set(true, forKey: hasBeenLaunchedBeforeFlag)
UserDefaults.standard.synchronize()
}
return isFirstLaunch
}
Step4
эта функция в AppDelegate.swift для получения URL, куда sqlite база данных должна быть перемещена:
func getDocumentsDirectory()-> URL {
let paths = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
return documentsDirectory
}
объявление Замены Шага 5
persistentContainer с этим:
// MARK: - Core Data stack
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "ProjectName")
let storeUrl = self.getDocumentsDirectory().appendingPathComponent("FileName.sqlite")
if UserDefaults.isFirstLaunch() {
let seededDataUrl = Bundle.main.url(forResource: "FileName", withExtension: "sqlite")
try! container.persistentStoreCoordinator.replacePersistentStore(at: storeUrl, destinationOptions: nil, withPersistentStoreFrom: seededDataUrl!, sourceOptions: nil, ofType: NSSQLiteStoreType)
}
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
Поскольку большинство ответов довольно старо, я рекомендую следующее учебное руководство. Это объясняет, как это может быть сделано.
Этот ответ только для людей, которые являются
я сделал предзаполненную базу данных SQLite для приложения для Android. Затем, когда я делал версию iOS приложения, я думал, что будет лучше использовать Базовые Данные. Таким образом, я провел довольно долгое время, изучая Базовые Данные и затем переписывая код для предварительного заполнения базы данных. При изучении, как сделать, каждый шаг в обеих платформах потребовал большого исследования и метода проб и ошибок. Было намного меньше перекрытия, чем я буду надеяться.
В конце я просто решил использовать ту же базу данных SQLite из своего проекта Android. Затем я использовал обертку FMDB для прямого доступа к базе данных в iOS. Преимущества:
, Хотя я не сожалею, что изучил Базовые Данные, если я должен был переделать их, я, возможно, сэкономил много времени, просто придерживаясь SQLite.
, Если бы Вы запускаете в iOS и затем планируете переместиться в Android, я все еще использовал бы обертку SQLite как FMDB или некоторое другое программное обеспечение для предварительного заполнения базы данных. Хотя можно технически извлечь базу данных SQLite, которую Вы предварительно заполняете с Базовыми Данными, схему (имена таблиц и имена столбцов, и т.д.) странно назовут.
Между прочим, если Вы не должны изменять свою предзаполненную базу данных, затем не копируют его в каталог документов после того, как приложение установлено. Просто получите доступ к нему непосредственно от пакета.
// get url reference to databaseName.sqlite in the bundle
let databaseURL: NSURL = NSBundle.mainBundle().URLForResource("databaseName", withExtension: "sqlite")!
// convert the url to a path so that FMDB can use it
let database = FMDatabase(path: databaseURL.path)
Это делает его так, чтобы у Вас не было двух копий.
Обновление
я теперь использую SQLite.swift, а не FMDB, потому что это интегрируется лучше с проектами Swift.
Как насчет проверки, если какие-либо объекты существуют и в противном случае создают один с некоторыми данными?
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Settings"];
_managedObjectSettings = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
if ([_managedObjectSettings count] == 0) {
// first time, create some defaults
NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"Settings" inManagedObjectContext:managedObjectContext];
[newDevice setValue:[NSNumber numberWithBool: YES ] forKey:@"speed"];
[newDevice setValue:[NSNumber numberWithBool: YES ] forKey:@"sound"];
[newDevice setValue:[NSNumber numberWithBool: NO ] forKey:@"aspect"];
[newDevice setValue:[NSNumber numberWithBool: NO ] forKey: @"useH264"];
[newDevice setValue:[NSNumber numberWithBool: NO ] forKey: @"useThumbnail"];
NSError *error = nil;
// Save the object to persistent store
if (![managedObjectContext save:&error]) {
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
}