Какой-либо путь к пред заполняет базовые данные?

Я создавал приложение списка и поддерживал его базовыми данными.

Я хотел бы иметь список по умолчанию, говорят, что объекты 10 аэропортов, так, чтобы пользователь не запускал с нуля.

Там какой-либо путь состоит в том, чтобы сделать это?

Любая справка ценится.Заранее спасибо.

62
задан 18 March 2014 в 14:30

4 ответа

Это работало на меня. Это - модификация этого ответ 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
}()
0
ответ дан 31 October 2019 в 13:58

Поскольку большинство ответов довольно старо, я рекомендую следующее учебное руководство. Это объясняет, как это может быть сделано.

https://www.youtube.com/watch? v=xcV8Ow9nWFo

0
ответ дан 31 October 2019 в 13:58

Этот ответ только для людей, которые являются

  • включая предзаполненную базу данных в Вашем приложении
  • , делающем приложение для нескольких платформ (iOS, Android, и т.д.)

я сделал предзаполненную базу данных SQLite для приложения для Android. Затем, когда я делал версию iOS приложения, я думал, что будет лучше использовать Базовые Данные. Таким образом, я провел довольно долгое время, изучая Базовые Данные и затем переписывая код для предварительного заполнения базы данных. При изучении, как сделать, каждый шаг в обеих платформах потребовал большого исследования и метода проб и ошибок. Было намного меньше перекрытия, чем я буду надеяться.

В конце я просто решил использовать ту же базу данных SQLite из своего проекта Android. Затем я использовал обертку FMDB для прямого доступа к базе данных в iOS. Преимущества:

  • Только потребность сделать предзаполненную базу данных однажды.
  • не требует сдвига парадигмы. Синтаксис между Android и FMDB, в то время как отличающийся, все еще довольно подобен.
  • Имеют намного больше контроля тем, как выполняются Запросы.
  • Позволяет полнотекстовый поиск.

, Хотя я не сожалею, что изучил Базовые Данные, если я должен был переделать их, я, возможно, сэкономил много времени, просто придерживаясь 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.

2
ответ дан 31 October 2019 в 13:58

Как насчет проверки, если какие-либо объекты существуют и в противном случае создают один с некоторыми данными?

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]);
    }
}
2
ответ дан 31 October 2019 в 13:58

Другие вопросы по тегам:

Похожие вопросы: