Last active
September 28, 2024 10:03
-
-
Save xavierchia/ef43abb270003ae63e5bbb7eb5404645 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# In AppDelegate: | |
# This is to make sure that it only happens on the first launch | |
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { | |
// Override point for customization after application launch. | |
let defaults = UserDefaults.standard | |
let isPreloaded = defaults.bool(forKey: "isPreloaded") | |
if !isPreloaded { | |
print("Preloading data for the first time") | |
preloadData() | |
defaults.set(true, forKey: "isPreloaded") | |
} | |
return true | |
} | |
# Preload the data | |
func preloadData() { | |
let sourceSqliteURLs = [Bundle.main.url(forResource: "DataModel", withExtension: "sqlite"), Bundle.main.url(forResource: "DataModel", withExtension: "sqlite-wal"), Bundle.main.url(forResource: "DataModel", withExtension: "sqlite-shm")] | |
let destSqliteURLs = [ | |
URL(fileURLWithPath: NSPersistentContainer.defaultDirectoryURL().relativePath + "/DataModel.sqlite"), | |
URL(fileURLWithPath: NSPersistentContainer.defaultDirectoryURL().relativePath + "/DataModel.sqlite-wal"), | |
URL(fileURLWithPath: NSPersistentContainer.defaultDirectoryURL().relativePath + "/DataModel.sqlite-shm")] | |
for index in 0...sourceSqliteURLs.count-1 { | |
do { | |
try FileManager.default.copyItem(at: sourceSqliteURLs[index]!, to: destSqliteURLs[index]) | |
} catch { | |
print("Could not preload data") | |
} | |
} | |
} | |
With SwiftUIApp, the process seems to be quite straightforward as well. The following approach seems to work for me.
If you are using the XCode-generated persistance model you have to replace this line
let persistence = PersistenceManager()
in your main app fille with this
let persistence: PersistenceManager
init() {
let defaults = UserDefaults.standard
let isPreloaded = defaults.bool(forKey: "isPreloaded")
if !isPreloaded {
print("Preloading data for the first time")
// copy the contents of preloadData function here
defaults.set(true, forKey: "isPreloaded")
}
persistence = PersistenceManager()
}
This is fantastic thank you!!!!!!! I've searched for hours for a solution.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Go here and click [download container], from the file go to Show Package Contents > App Data > Library > Application Support
Make sure you add the files to your folder and app bundle at Targets > Build Phases > Copy Bundle Resources. I personally like to put the source files in Model folder > Preload data folder
Don't forget to
check
Target Membership