iOS, Objective-C, Swift에서 Core Data와 관련된 SQLite 파일 위치
파일 위치
Core Data는 앱의 샌드박스 내에 SQLite 데이터베이스를 저장합니다. 정확한 위치는 앱이 문서 기반인지 여부에 따라 다릅니다.
- 문서 기반 앱: 문서 기반 앱의 경우 SQLite 데이터베이스는 앱의
Documents
디렉터리에 저장됩니다. 이 디렉터리는 사용자가 직접 만든 파일을 저장하는 데 사용됩니다.
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let databaseURL = documentsDirectory.appendingPathComponent("CoreData.sqlite")
- 비 문서 기반 앱: 비 문서 기반 앱의 경우 SQLite 데이터베이스는 앱의
Application Support
디렉터리에 저장됩니다. 이 디렉터리는 앱 설정 및 기타 지원 데이터를 저장하는 데 사용됩니다.
let applicationSupportDirectory = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!
let databaseURL = applicationSupportDirectory.appendingPathComponent("CoreData.sqlite")
SQLite 파일 위치 확인
Core Data 스택을 설정할 때 NSPersistentStoreCoordinator
클래스의 persistentStores
속성을 사용하여 SQLite 파일 위치를 확인할 수 있습니다.
let persistentStores = coordinator.persistentStores
for store in persistentStores {
if let url = store.url {
print("SQLite 파일 위치: \(url.path)")
}
}
참고 사항
- SQLite 데이터베이스는 직접 열거나 수정하지 마십시오. 항상 Core Data 프레임워크를 통해 데이터베이스에 액세스하고 수정하십시오.
- 앱이 배포되면 SQLite 데이터베이스가 암호화됩니다. 암호화된 데이터베이스에 직접 액세스할 수 없습니다.
- iOS 10부터 Apple은 앱 샌드박스 내의 파일 액세스를 제한하기 시작했습니다. 앱이 다른 앱의 데이터에 액세스하려면 앱 그룹을 사용해야 합니다.
iOS, Objective-C 및 Swift에서 Core Data와 관련된 SQLite 파일 위치를 찾는 예제 코드
Objective-C
#import <CoreData/CoreData.h>
- (NSString *)applicationDocumentsDirectory {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return documentsDirectory;
}
- (NSString *)sqliteFilePath {
NSString *documentsDirectory = [self applicationDocumentsDirectory];
return [documentsDirectory stringByAppendingPathComponent:@"CoreData.sqlite"];
}
- (void)applicationDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// ...
NSPersistentStoreCoordinator *persistentStoreCoordinator = [[self persistentStoreCoordinator] retain];
for (NSPersistentStore *store in [persistentStoreCoordinator persistentStores]) {
if ([store.URL isFileURL]) {
NSLog(@"SQLite 파일 위치: %@", store.URL.path);
}
}
// ...
}
Swift
import CoreData
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let databaseURL = documentsDirectory.appendingPathComponent("CoreData.sqlite")
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// ...
if let coordinator = persistentContainer.persistentStoreCoordinator {
for store in coordinator.persistentStores {
if let url = store.url, url.isFileURL {
print("SQLite 파일 위치: \(url.path)")
}
}
}
// ...
}
설명
이 코드는 다음을 수행합니다.
applicationDocumentsDirectory
또는documentsDirectory
함수를 사용하여 앱의Documents
디렉터리 경로를 가져옵니다.CoreData.sqlite
라는 이름의 파일을Documents
디렉터리에 추가하여 SQLite 파일 경로를 만듭니다.persistentStoreCoordinator
의persistentStores
속성을 사용하여 SQLite 파일 위치를 출력합니다.
iOS, Objective-C, Swift에서 Core Data와 관련된 SQLite 파일 위치를 찾는 대체 방법
FileManager를 사용하기
FileManager
클래스를 사용하여 앱의 Documents
또는 Application Support
디렉터리를 검색하고 CoreData.sqlite
파일을 찾을 수 있습니다. 다음은 예제 코드입니다.
import Foundation
let fileManager = FileManager.default
func findSQLiteFilePath() -> URL? {
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first
let applicationSupportURL = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask).first
if let documentsURL = documentsURL {
let documentsSQLiteURL = documentsURL.appendingPathComponent("CoreData.sqlite")
if fileManager.fileExists(atPath: documentsSQLiteURL.path) {
return documentsSQLiteURL
}
}
if let applicationSupportURL = applicationSupportURL {
let applicationSupportSQLiteURL = applicationSupportURL.appendingPathComponent("CoreData.sqlite")
if fileManager.fileExists(atPath: applicationSupportSQLiteURL.path) {
return applicationSupportSQLiteURL
}
}
return nil
}
Bridging Header를 사용하기 (Objective-C만 해당)
Objective-C 프로젝트에서 Bridging Header를 사용하여 NSPersistentStoreCoordinator
클래스의 persistentStores
속성에 직접 액세스할 수 있습니다. 다음은 예제 코드입니다.
#import <CoreData/CoreData.h>
// Bridging Header에서 선언
extern NSArray *NSPersistentStoreCoordinatorGetPersistentStores(NSPersistentStoreCoordinator *coordinator);
- (NSArray *)persistentStores {
return NSPersistentStoreCoordinatorGetPersistentStores(self);
}
- (NSString *)sqliteFilePath {
for (NSPersistentStore *store in [self persistentStores]) {
if ([store.URL isFileURL]) {
return store.URL.path;
}
}
return nil;
}
FMDB 라이브러리 사용하기
FMDB는 SQLite 데이터베이스를 쉽게 사용할 수 있도록 하는 오픈 소스 라이브러리입니다. FMDB를 사용하여 Core Data와 관련된 SQLite 파일 위치를 찾을 수도 있습니다. 다음은 예제 코드입니다.
import FMDB
let databasePath = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: .documentFile, create: false).appendingPathComponent("CoreData.sqlite")
let database = FMDatabase(path: databasePath.path)
if database.open() {
// ...
} else {
print("데이터베이스를 열 수 없습니다.")
}
database.close()
ios objective-c swift