IT

SQLite 파일 위치 핵심 데이터

itgroup 2023. 8. 1. 20:27
반응형

SQLite 파일 위치 핵심 데이터

일반적으로 핵심 데이터 앱의 sqlite 저장소 파일은 다음 위치에 있습니다.

라이브러리 > 응용 프로그램 지원 > iPhone Simulator > 7.1(또는 사용 중인 버전)>응용프로그램>(어플리케이션이 포함된 폴더)>문서

IOS 8에서 찾을 수 없습니다. iPhone Simulator 폴더 안에 8.0 폴더를 추가하면 된다고 생각합니다. 하지만 없습니다.누가 그것을 찾을 수 있었나요?

간신히 sqlite 파일을 찾았는데, 이제 이 경로에 있습니다.

라이브러리/개발자/코어 시뮬레이터/디바이스/(숫자 및 문자)/데이터/컨테이너/데이터/응용프로그램/(숫자 및 문자)/문서/

(숫자와 문자)는 앱/컴퓨터에 고유하지만 779와 같은 모양의 폴더를 나타냅니다.AE2245-F8W2-57A9-8C6D-98643B1CF01A

appDelegate.m에 들어가서 아래로 스크롤하여 찾을 수 있었습니다.

- (NSURL *)applicationDocumentsDirectory 

메소드 및 NS 로그 반환 경로를 다음과 같이 기록합니다.

// Returns the URL to the application's Documents directory.
- (NSURL *)applicationDocumentsDirectory
{
    NSLog(@"%@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory  inDomains:NSUserDomainMask] lastObject]);

    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
 }

이렇게 하면 고유한 경로가 제공되므로 이름 없는 두 개의 폴더/문자열과 숫자로 경로를 찾기가 까다롭기 때문에 쉽게 찾을 수 있습니다.

Swift 4.2:

let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
print(paths[0])

DB 파일의 위치를 실제로 확인할 수 있는 가장 간단한 방법에 대해 언급한 답변은 없습니다.

XCode의 단순한 런타임 스위치이므로 소스 코드를 수정할 필요도 없습니다.

  1. 구성표 편집 선택...[실행] 단추 옆에 있습니다.

    edit scheme

  2. 실행 / 인수를 선택하고 다음 두 가지 옵션을 추가합니다.

    -com.apple.CoreData.SQLDebug 1
    -com.apple.CoreData.Logging.stderr 1
    

    option

  3. 앱을 실행하면 로그에 다음이 표시됩니다.

    logs

이 간단한 3단계 사용

  1. 를 코복드를니다합에 합니다.didFinishLaunchingWithOptions당신의.appdelegate.m 리고브크포추가다니합를인트그 합니다.NSLog()

    (BOOL)application:(UIApplication *)application  
    
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSLog(@"%@",[paths objectAtIndex:0]);
     }
    

또는 Swift에서:

let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
print(paths[0])

enter image description here

2. 파인더 열기 -> 이동 -> 폴더로 이동하여 1단계에서 복사한 경로를 붙여넣기

enter image description here

예!!!목적지에 있습니다.

앱에서 코어 데이터를 사용하는 경우 터미널에서 sqlite 파일을 검색하면 됩니다.

find ~ -name app_db_file_name.sqlite

결과에는 앱이 포함된 시뮬레이터 폴더의 전체 경로가 나열됩니다.

나는 이 한 줄기를 해킹했습니다(지스트)find ~/Library/Developer/CoreSimulator/Devices/ -name device.plist -exec sh -c "/usr/libexec/PlistBuddy -c \"print UDID\" '{}' | tr '\n' ' '" \; -exec sh -c "/usr/libexec/PlistBuddy -c \"print name\" '{}' | tr '\n' ' '" \; -exec sh -c "/usr/libexec/PlistBuddy -c \"print runtime\" '{}' | sed -n 's/com\.apple\.CoreSimulator.SimRuntime\.\(.*\)/\1/p'" \;

인쇄할 내용:

14F313C8-3813-4E38-903E-2010C136B77B iPad Retina iOS-8-0
1F6B82A2-C467-479A-8CAF-074BE507AC8E iPad Air iOS-8-0
2DA83944-BE5D-4342-B330-08F67A932D8C iPad 2 iOS-7-1
48703432-A5C5-4606-9369-0D21B53EB1E8 iPhone 4s iOS-7-1
4AFB71CC-6752-4F9A-A239-4DC9CA53A8B8 iPhone 5s iOS-8-0
53A65771-DF50-4A5C-A8D2-4D1C3A5D0F60 iPhone 5 iOS-7-1
6B97C174-5914-4E89-8D17-943F0E2703BA iPhone 5 iOS-8-0
6C2DF3E9-FA26-4391-8B66-72E1467D6297 iPad 2 iOS-8-0
7F85E299-A3C2-4704-8B44-2984F6F995F5 iPad Retina iOS-7-1
8B9EDFFD-2240-476B-88AD-06ABE8F9FF51 iPhone 6 Plus iOS-8-0
97691E5D-5C38-4875-8AA7-C2B1E4ABCBB5 Resizable iPhone iOS-8-0
9BBF3408-6CA4-4CE0-BD4E-B02001F1262B iPhone 5s iOS-7-1
C9237847-F0AA-44BC-A74E-C08C2E0F7A6C Resizable iPad iOS-8-0
CC44C1BA-F39C-4410-AE34-4ABBD7806D45 iPad Air iOS-7-1
CDF4D811-5011-4464-8291-5CDA378375EA iPhone 6 iOS-8-0
E77DE00C-E244-4F25-A5E2-E6581614D5A2 iPhone 4s iOS-8-0

업데이트:

누군가가 여기서 지적했듯이, 실행하는 것도 가능합니다.xcrun simctl list devices유사한 결과를 얻는 방법:

== Devices ==
-- iOS 7.0 --
-- iOS 7.1 --
    iPhone 4s (48703432-A5C5-4606-9369-0D21B53EB1E8) (Shutdown)
    iPhone 5 (53A65771-DF50-4A5C-A8D2-4D1C3A5D0F60) (Shutdown)
    iPhone 5s (9BBF3408-6CA4-4CE0-BD4E-B02001F1262B) (Shutdown)
    iPad 2 (2DA83944-BE5D-4342-B330-08F67A932D8C) (Shutdown)
    iPad Retina (7F85E299-A3C2-4704-8B44-2984F6F995F5) (Shutdown)
    iPad Air (CC44C1BA-F39C-4410-AE34-4ABBD7806D45) (Shutdown)
-- iOS 8.1 --
    iPhone 4s (0763EF65-DD0D-4FAD-84C7-2DE63D416526) (Shutdown)
    iPhone 5 (868ED444-8440-4115-AF37-F419CC682D2F) (Shutdown)
    iPhone 5s (E0455E5D-7315-4EC8-B05E-76284728244C) (Shutdown)
    iPhone 6 Plus (72554908-FF99-4B8F-9B87-65255ED08CFC) (Shutdown)
    iPhone 6 (32AA8133-53A4-4BE0-8CE5-0C7A87E81CAF) (Shutdown)
    iPad 2 (4AF84DE8-CBA2-47AE-A92A-0C0CEF9F41F8) (Booted)
    iPad Retina (69238B44-AAFD-4CD5-AAEA-C182D0BC300D) (Shutdown)
    iPad Air (E580AD99-0040-4EC1-B704-0C85567E6747) (Shutdown)
    Resizable iPhone (32E872FC-6513-41AB-A5B9-B23EB7D10DC8) (Shutdown)
    Resizable iPad (99997922-4A9F-4574-9E3E-EF45F893F4A2) (Shutdown)

Swift를 사용하는 경우 문서 디렉토리의 절대 경로가 반환됩니다.

func applicationDirectoryPath() -> String {
    return NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as String
}

시뮬레이터 내에서 당신의 응용 프로그램 폴더와 응용 프로그램 데이터 폴더의 위치를 찾기 위한 bash 스크립트를 작성했습니다. 여기에서 다운로드할 수 있습니다.스크립트의 압축을 풀면 스크립트가 있는 폴더로 이동하여 사용할 수 있습니다.옵션 없이 호출하면 설치된 iOS 시뮬레이터 목록이 제공됩니다.그런 다음 옵션을 사용하여 프로그램을 찾을 수 있습니다.쓰기:

./simulatorAppFolders -s "iPad Air" -i iOS-8-0 -a <MyApp>

iPad Air iOS 8 시뮬레이터에서 앱의 응용프로그램 폴더와 홈 영역 폴더를 찾을 수 있습니다.다음은 예입니다.

MacBook-Air:_posts user$ ./simulatorAppFolders -s "iPad Air" -i iOS-8-0 -a MyApp
App folder = /Users/james/Library/Developer/CoreSimulator/Devices/6A9DEE93-FAEF-4BF4-9989-BC14CD38AEA0/data/Containers/Bundle/Application/8F64CD7F-A227-43D6-98AC-41D3919827CB
dataFolder = /Users/james/Library/Developer/CoreSimulator/Devices/6A9DEE93-FAEF-4BF4-9989-BC14CD38AEA0/data/Containers/Data/Application/96C40A21-5A5C-4399-839C-B155B8A72932

갱신하다

-d 옵션을 사용하여 장치 유형을 기준으로 검색할 수 있는 원본 스크립트에 대한 업데이트가 있습니다.나는 또한 당신이 당신의 응용프로그램과 응용프로그램 문서를 찾을 수 있도록 일련의 현명한 이름의 폴더를 만드는 다른 스크립트를 작성했습니다. 스크립트는 홈 영역에 iOS_SIMATULATORS라는 폴더를 만들고 거기서 애플리케이션으로 쉽게 이동할 수 있습니다.

다음 콘솔 출력에서 시뮬레이터 폴더를 찾을 수 있었습니다.

NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);

나의 경우에는 (Xcode 6 베타)였습니다.

app dir: file:///Users/user/Library/Developer/CoreSimulator/Devices/D00C56D4-DDA3-47B0-9951-27D3B9EC68E8/data/Applications/6ABF3E54-37F5-4AD1-A223-F7467F601FB6/Documents/

마이클스의 답변에 따르면, 이것은 스위프트 3을 위한 것입니다.

    func applicationDirectoryPath() -> String {
        return NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as String
    }

Xcode를 새로 업데이트한 후 sql 파일이 새 폴더에 저장되어 있는 것을 발견했습니다. 이것은 고유한 상황일 수 있지만 문서 폴더에서 sql 파일을 찾지 못한 경우 여기에서 검색하십시오.

~/Library/Developer/CoreSimulator/Devices/[@device_id@]/data/Containers/Data/Application/[@application_id@]/Library/Application Support/

폴더에 저장하기 전:

~/Library/Developer/CoreSimulator/Devices/[@device_id@]/data/Containers/Data/Application/[@application_id@]/Documents/

Swift 3.0용

let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
print(paths[0])

당신은 Xcode 8.2에서 코어 데이터의 위치를 얻을 수 있습니다.

SWIFT 3의 경우:

didFinishLaunchingWithOptions에 이 코드를 복사하여 붙여넣기

 print(NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).last! as String)

빠른 3을 위하여.

print(NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).last! as String)

빠른 4.x

NSPersistentContainer 설명에서 안정적으로 가져올 수 있습니다.

for description in container.persistentStoreDescriptions {
    print("db location: \(description.url!)")
}

제임스 스누크처럼 저는 시뮬레이터 앱에 더 쉽게 접근할 수 있도록 저만의 스크립트를 만들었습니다.저 말고 많은 분들이 오시기에 편리할 것 같습니다.

그의 스크립트와 달리, 내 것은 검색 도구가 아니라 모든 장치/실행 시간이 포함된 완전한(그리고 사람이 읽을 수 있는) 폴더 구조를 만들고 그 안에 있는 앱에 대한 소프트 링크를 넣습니다.

Gist에서 확인할 수 있습니다.

시뮬레이터에 앱을 설치할 때마다 실행하거나, 어떤 이유로든 앱을 가져올 때마다 실행하면 됩니다(업데이트되고 파인더에서 장치 폴더가 열립니다).

위해서iOS 10.0+사용할 수 있습니다.persistentContainer.persistentStoreCoordinator.persistentStores.first?.url

sqlite 파일을 원하는 위치에 복사하는 유틸리티 기능을 만들었습니다(시뮬레이터에서만 작동합니다).

다음과 같이 사용할 수 있습니다.

import CoreData


let appDelegate = UIApplication.shared.delegate as! AppDelegate
UTility.getSqliteTo(destinationPath: "/Users/inderkumarrathore/Desktop", persistentContainer: appDelegate.persistentContainer)

이미 sqlite, shm 및 wal 파일에 액세스한 경우 터미널에서 명령을 실행하여 WAL 파일을 sqlite 파일로 병합합니다.

$ sqlite3 persistentStore
sqlite> PRAGMA wal_checkpoint;
Press control + d

위의 명령을 실행하면 sqlite 파일의 데이터를 볼 수 있습니다.


다음은 swift에 유틸리티 방법의 정의입니다.

/**
 Copies the sqlite, wal and shm file to the destination folder. Don't forget to merge the wal file using the commands printed int the console.
 @param destinationPath Path where sqlite files has to be copied
 @param persistentContainer NSPersistentContainer
*/
public static func getSqliteTo(destinationPath: String, persistentContainer: NSPersistentContainer) {
  let storeUrl = persistentContainer.persistentStoreCoordinator.persistentStores.first?.url

  let sqliteFileName = storeUrl!.lastPathComponent
  let walFileName = sqliteFileName + "-wal"
  let shmFileName = sqliteFileName + "-shm"
  //Add all file names in array
  let fileArray = [sqliteFileName, walFileName, shmFileName]

  let storeDir = storeUrl!.deletingLastPathComponent()

  // Destination dir url, make sure file don't exists in that folder
  let destDir = URL(fileURLWithPath: destinationPath, isDirectory: true)

  do {
    for fileName in fileArray {
      let sourceUrl = storeDir.appendingPathComponent(fileName, isDirectory: false)
      let destUrl = destDir.appendingPathComponent(fileName, isDirectory: false)
      try FileManager.default.copyItem(at: sourceUrl, to: destUrl)
      print("File: \(fileName) copied to path: \(destUrl.path)")
    }
  }
  catch {
    print("\(error)")
  }
  print("\n\n\n ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ NOTE ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\n")
  print("In your terminal run the following commands to merge wal file. Otherwise you may see partial or no data in \(sqliteFileName) file")
  print("\n-------------------------------------------------")
  print("$ cd \(destDir.path)")
  print("$ sqlite3 \(sqliteFileName)")
  print("sqlite> PRAGMA wal_checkpoint;")
  print("-------------------------------------------------\n")
  print("Press control + d")      
}

의 경우

/**
 Copies the sqlite, wal and shm file to the destination folder. Don't forget to merge the wal file using the commands printed int the console.
 @param destinationPath Path where sqlite files has to be copied
 @param persistentContainer NSPersistentContainer
 */
+ (void)copySqliteFileToDestination:(NSString *)destinationPath persistentContainer:(NSPersistentContainer *)persistentContainer {
  NSError *error = nil;
  NSURL *storeUrl = persistentContainer.persistentStoreCoordinator.persistentStores.firstObject.URL;
  NSString * sqliteFileName = [storeUrl lastPathComponent];
  NSString *walFileName = [sqliteFileName stringByAppendingString:@"-wal"];
  NSString *shmFileName = [sqliteFileName stringByAppendingString:@"-shm"];
  //Add all file names in array
  NSArray *fileArray = @[sqliteFileName, walFileName, shmFileName];

  // Store Directory
  NSURL *storeDir = storeUrl.URLByDeletingLastPathComponent;

  // Destination dir url, make sure file don't exists in that folder
  NSURL *destDir = [NSURL fileURLWithPath:destinationPath isDirectory:YES];

  for (NSString *fileName in fileArray) {
    NSURL *sourceUrl = [storeDir URLByAppendingPathComponent:fileName isDirectory:NO];
    NSURL *destUrl = [destDir URLByAppendingPathComponent:fileName isDirectory:NO];
    [[NSFileManager defaultManager] copyItemAtURL:sourceUrl toURL:destUrl error:&error];
    if (!error) {
      RLog(@"File: %@ copied to path: %@", fileName, [destUrl path]);
    }
  }


  NSLog(@"\n\n\n ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ NOTE ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\n");
  NSLog(@"In your terminal run the following commands to merge wal file. Otherwise you may see partial or no data in %@ file", sqliteFileName);
  NSLog(@"\n-------------------------------------------------");
  NSLog(@"$ cd %@", destDir.path);
  NSLog(@"$ sqlite3 %@", sqliteFileName);
  NSLog(@"sqlite> PRAGMA wal_checkpoint;");
  NSLog(@"-------------------------------------------------\n");
  NSLog(@"Press control + d");
}

디렉터리를 지정하지 않은 경우 다음 코드를 사용하여 기본 디렉터리를 인쇄할 수 있습니다.

print(NSPersistentContainer.defaultDirectoryURL())

스위프트 4.2

let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
        print(paths[0])

스위프트 4.2

다음을 위한 확장을 만들었습니다.NSPersistentStoreDescription

import CoreData

extension NSPersistentStoreDescription {
    func getDatabaseLocation() -> String? {
        return self
            .url?
            .absoluteString
            .replacingOccurrences(of: "file://", with: "") // Remove file suffix
            .replacingOccurrences(of: "%20", with: "\\ ") // Make the spaces to support terminal paste
    }
}

그런 다음 초기화할 때 사용합니다.NSPersistentContainer

lazy var persistentContainer: NSPersistentContainer = {

        let container = NSPersistentContainer(name: "CoreDataDemo")
        
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            
            #if DEBUG
            debugPrint(storeDescription.getDatabaseLocation() ?? "No database location")
            #endif
            
            if let error = error as NSError? {
                assertionFailure("Unresolved error \(error), \(error.userInfo)")
            }
        })
        
        return container
    }()

스위프트 4.x

    let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
    print(paths[0])
  1. 편집 구성을 선택하십시오. 여기에 이미지 설명 입력

  2. 실행 / 인수를 선택하고 다음 두 가지 옵션을 추가합니다. - 인수 두 개 추가

-com.apple.핵심 데이터.SQL 디버그 1 - com.apple.핵심 데이터.Logging.stderr 1

여기에 이미지 설명 입력

  1. XCode 콘솔에 이미지 설명을 여기에 입력합니다.

  2. -> Finder ->를 클릭한 후 GO를 클릭합니다.

  3. 리스트 항목

  4. 복사하여 붙여넣기

  5. 리스트 항목

스위프트 3.x

AppDelegate 파일에서 FinishLaunchingWithOptions 기능을 찾아 이 코드를 전달했습니다.

let path = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true)
print("\(path)")

다음 코드를 사용할 수 있습니다.

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    **print(persistentContainer.persistentStoreDescriptions)**
    return true
}

핵심 데이터 영구 스토리지(예: sqlite)의 위치를 인쇄합니다.

언급URL : https://stackoverflow.com/questions/24133022/sqlite-file-location-core-data

반응형