iOS, Objective-C, Swift에서 Core Data와 관련된 SQLite 파일 위치

2024-07-27

파일 위치

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)")
            }
        }
    }
    
    // ...
}

설명

이 코드는 다음을 수행합니다.

  1. applicationDocumentsDirectory 또는 documentsDirectory 함수를 사용하여 앱의 Documents 디렉터리 경로를 가져옵니다.
  2. CoreData.sqlite라는 이름의 파일을 Documents 디렉터리에 추가하여 SQLite 파일 경로를 만듭니다.
  3. persistentStoreCoordinatorpersistentStores 속성을 사용하여 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

ios objective c swift

Windows 개발 머신에서 iPhone 앱 개발하기

1. 가상 머신 사용가상 머신(VM)은 Windows PC에서 macOS를 실행할 수 있도록 하는 소프트웨어입니다. 가장 인기 있는 VM 프로그램으로는 VMware Workstation과 Parallels Desktop이 있습니다