Gdzie umieścić plik bazy danych SQLite w aplikacji na iPhone ' a?
Kiedy początkowo utworzyć plik bazy danych SQLite z wstępnie wstawionych zestawów danych dla mojej aplikacji, musiałbym umieścić ten plik gdzieś w moim projekcie Xcode tak, że idzie do mojej aplikacji iPhone. Myślę ,że "ressources" jest właściwym miejscem na to.
Jakie są podstawowe "kroki" wdrożenia pliku bazy danych SQLite w aplikacji iPhone?
- ręczne tworzenie bazy danych
- dodanie pliku bazy danych do projektu (gdzie?)
I ' m obecnie czytam całą dokumentację SQLite, chociaż nie jest to dużo związane z iPhonem.
2 answers
Musisz najpierw dodać plik SQLite do projektu Xcode - Najbardziej odpowiednie miejsce znajduje się w folderze zasoby.
Następnie w pliku kodu delegata aplikacji, w metodzie appDidFinishLaunching, musisz najpierw sprawdzić, czy zapisywalna kopia pliku SQLITE została już utworzona - czyli: kopia pliku SQLITE została utworzona w folderze Dokumentów users w systemie plików iPhone ' a. Jeśli tak, nic nie robisz (w przeciwnym razie Nadpisz go domyślnym Xcode Kopia SQLite)
Jeśli nie, skopiujesz tam plik SQLite - aby można było go zapisać.
Zobacz poniższy przykład kodu, aby to zrobić: zostało to zaczerpnięte z przykładowego kodu Apple ' a SQLite books, gdzie ta metoda jest wywoływana z metody appdidfinishlaunching.
// Creates a writable copy of the bundled default database in the application Documents directory.
- (void)createEditableCopyOfDatabaseIfNeeded {
// First, test for existence.
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"bookdb.sql"];
success = [fileManager fileExistsAtPath:writableDBPath];
if (success)
return;
// The writable database does not exist, so copy the default to the appropriate location.
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"bookdb.sql"];
success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if (!success) {
NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
}
}
============
Oto powyższy kod w Swift 2.0 +
// Creates a writable copy of the bundled default database in the application Documents directory.
private func createEditableCopyOfDatabaseIfNeeded() -> Void
{
// First, test for existence.
let fileManager: NSFileManager = NSFileManager.defaultManager();
let paths:NSArray = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
let documentsDirectory:NSString = paths.objectAtIndex(0) as! NSString;
let writableDBPath:String = documentsDirectory.stringByAppendingPathComponent("bookdb.sql");
if (fileManager.fileExistsAtPath(writableDBPath) == true)
{
return
}
else // The writable database does not exist, so copy the default to the appropriate location.
{
let defaultDBPath = NSBundle.mainBundle().pathForResource("bookdb", ofType: "sql")!
do
{
try fileManager.copyItemAtPath(defaultDBPath, toPath: writableDBPath)
}
catch let unknownError
{
print("Failed to create writable database file with unknown error: \(unknownError)")
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-16 20:43:38
Jeśli chcesz po prostu pytać o dane, powinieneś być w stanie zostawić je w głównym pakiecie.
To jednak prawdopodobnie nie jest dobra praktyka. Jeśli miałbyś rozszerzyć swoją aplikację w przyszłości, aby umożliwić pisanie baz danych, musiałbyś wszystko wymyślić ponownie...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-23 12:30:35