Sqlite文件位置核心数据


91

通常,核心数据应用的sqlite存储文件位于

库>应用程序支持> iPhone Simulator> 7.1(或您使用的任何版本)>应用程序>(哪个文件夹包含您的应用程序)>文档

文件夹,但在IOS 8中找不到。我假设他们只是在iPhone Simulator文件夹中添加了一个8.0文件夹,但它不存在。有人能够找到它吗?


2
我很确定您的问题是重复的,考虑到我是在问您一个星期之前问过的。如果您让我获得这个问题的荣誉,我们将不胜感激,考虑到这是我问过的第一个问题,并且您似乎已经享有声誉@HenryGlendening
2014年

看看这个如何检查dbpath stackoverflow.com/a/27358291/3840428
Nagarjun 2014年


2
有人知道如何从实际设备中获取CoreData文件吗?我曾经在旧版本的Xcode中通过iTunes进行此操作,但是由于Xcode 8 / iOS10,我不认为CoreData文件存储在应用程序的文档目录中,因此在iTunes中不可见。有没有办法从您计算机上的设备获取CoreDate文件?
Bocaxica

1
我不知道他们为什么继续这样做。他们应该把它放到某个地方然后就离开它。
RegularExpression

Answers:


135

我设法找到了sqlite文件,现在在此路径中:

库/开发人员/ CoreSimulator /设备/(数字和字母)/数据/容器/数据/应用程序/(数字和字母)/文档/

(数字和字母)代表您的应用程序/计算机唯一的文件夹,但看起来像这样:779AE2245-F8W2-57A9-8C6D-98643B1CF01A

我可以通过进入appDelegate.m并向下滚动到

- (NSURL *)applicationDocumentsDirectory 

方法,以及NSLogging返回路径,如下所示:

// 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];
 }

这将为您提供独特的路径,使您更轻松,因为使用2个未命名的文件夹/字母和数字字符串查找它很棘手。

Swift 4.2:

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

4
使用xcrun simctl list得到模拟器的名字和他们的UUID的列表。
桑迪·查普曼

1
请注意,如果您为应用程序组使用共享数据库(例如,当您使用扩展程序时),路径为Library / Developer / CoreSimulator / Devices / $ number / data / Containers / Shared / AppGroup / $ number / Name.sqlite
andreacipriani 2015年

6
请注意,在2019年Library/Developer/CoreSimulator/Devices/(numbers and letters)/data/Containers/Data/Application/(numbers and letters)/Documents/它不再是正确的。现在,您在Library/Developer/CoreSimulator/Devices/(numbers and letters)/data/Containers/Data/Application/(numbers and letters)/Library/Application Support/
Gang Fang

@GangFang我正在尝试将Xcode 7中构建的Objective C代码转换为最新的Swift版本并创建新项目,因此如何将这两个不同的.sqlite文件迁移到一个地方。
Sanjay Shah

83

没有一个答案提到实际获取数据库文件位置的最简单方法。

它甚至不需要您修改源代码,因为它是XCode中的一个简单的运行时开关。

  1. 选择“运行”按钮旁边的“编辑方案...”。

    编辑方案

  2. 选择运行/参数并添加以下两个选项:

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

    选项

  3. 运行该应用程序,您将在日志中看到:

    日志


2
这确实是最简单,最好的解决方案。谢谢!
奥米

对我来说,日志没有出现,您可以帮助我吗?
奥古斯托

@Augusto我在这里不能为您提供帮助,但是如果您提出一个新问题,人们可能会回答并帮助您。
hyperknot

好答案!这应该是公认的答案。除了通过Xcode首选项之外,您是否还知道有什么方法可以在控制台中更改此输出的颜色?如果它能脱颖而出,那就太好了
Coreyd303 '19

谢谢你的提示!路径不断变化,对我而言(iOS 13.3.1)路径是/ Users / *** / Library / Developer / CoreSimulator / Devices / A91CEB1C-B15D-46B5-9B83-DB22056DEFD1 / data / Containers / Shared / AppGroup / B835599A- CA36-432F-871A-17EDA181CC54 /因此,最好是从CoreData调试信息中获取它,而不要尝试猜测自己。
AlKir

52

试试这个简单的3个步骤

  1. 在下面的代码复制didFinishLaunchingWithOptionsappdelegate.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])

在此处输入图片说明

2.打开Finder->转到->转到文件夹并粘贴从步骤1复制的路径

在此处输入图片说明

3.耶!您在目的地。


2
对于swift3,请使用:NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory,.userDomainMask,true)

38

如果您的应用使用的是Core Data,则只需在Terminal中搜索sqlite文件即可:

find ~ -name app_db_file_name.sqlite

结果将列出包含您的应用程序的模拟器文件夹的完整路径。


2
@AlexWei我希望苹果公司可以在“文件”菜单上的“查找器中的Reveal Simulator文档文件夹”中添加一个按钮或类似的按钮。考虑到他们一直在改变文件的存储位置,似乎还很荒谬……
DiscDev 2014年

1
如果其他人有兴趣,我将此命令添加为.profile:的别名alias myapp_simulator_db="find ~/Library/Developer/CoreSimulator/Devices -name MyApp.sqlite"。当您需要重复运行此命令时,它很方便。
吐司

sudo find〜-name app_db_file_name.sqlite帮助了我
Qadir Hussain

21

我砍了这个单线(Gist): 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)

18

如果您使用的是Swift,这将返回文档目录的绝对路径:

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

1
应该命名为“ func documentDirectoryPath()”,这就是您要去的地方……
Yohst 2016年

13

我编写了一个bash脚本,用于在模拟器中查找Application文件夹和Application数据文件夹的位置,您可以在此处下载它。解压缩脚本后,您可以导航到脚本所在的文件夹并使用它。如果您不带任何选项调用它,它将为您提供已安装的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_SIMULATORS的文件夹,您可以从那里轻松导航至您的应用程序。


完美,我编辑了您的脚本,制作了另一个脚本来重新初始化某个应用程序的所有模拟器数据。非常感谢James!
马丁

谢谢!通用PITA的绝佳解决方案。
David Hersey

6

我能够在下一个控制台输出中找到模拟器文件夹:

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

在我的情况下是(Xcode 6 beta)

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


5

对于Swift 3.0

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

您可以在Xcode 8.2中获取Coredata的位置


5

Xcode的新更新后,我发现sql文件现在存储在新文件夹中,/Library/Application Support这可能是一种特殊情况,但是如果您未在文档文件夹中找到sql文件,请在此处搜索:

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

在将其存储在Documents文件夹中之前:

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


4

对于SWIFT 3:

复制将此代码粘贴到didFinishLaunchingWithOptions中

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

这对我有帮助。但是当我尝试通过终端转到该路径时,它说:没有这样的文件或目录,但是当我尝试转到文件夹选项时,它实际上存在。
卡迪尔·侯赛因

这在OSX上对我有用。我需要在名为“ <我的应用程序名称>”的“应用程序支持”目录中再添加1个目录,以优化.sqlite文件。
Jacksonsox

3

迅捷3

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

2

James Snook一样,我创建了自己的脚本,以更轻松地访问模拟器应用程序。我认为这对除我以外的许多人来说很方便。

与他的脚本不同,我的不是搜索工具,它创建了具有所有设备/运行时的完整(人类可读)文件夹结构,并在其中添加了指向应用程序的软链接。

您可以在本要点中获得它。

每次在模拟器中安装应用程序时运行它,或者由于某种原因在每次获取应用程序时都运行它(它将更新,并在Finder中打开devices文件夹)。


您可以调整此脚本以使其自动化。但是我必须说,如果您只想访问应用程序文件夹,我刚刚发现的这个GUI应用程序听起来是一个非常有用的替代方法:)
fbeeper 2014年

这也很好,但是我更喜欢James Snook发布的第二个脚本,因为它也创建了到数据目录的软链接。
David Hersey

2

如果未指定任何目录,则可以使用以下代码打印默认目录:

打印(NSPersistentContainer.defaultDirectoryURL())


1

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文件中查看数据。


这是实用程序方法的定义

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

0

斯威夫特3.x

在您的AppDelegate文件中找到didFinishLaunchingWithOptions函数,并将此代码粘贴在那里。

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

0

斯威夫特4.x

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

0

斯威夫特4.2

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

-1

您可以使用以下代码。

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

它将打印核心数据持久存储的位置,即sqlite

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.