Trong Xcode 6, tôi có một ứng dụng tôi đang sử dụng Core Data, nhưng không có thư mục nào trong Hỗ trợ ứng dụng cho Trình mô phỏng iPhone iOS 8. Các tập tin và cơ sở dữ liệu sqlite Core Data của tôi đang được lưu trữ ở đâu?
Trong Xcode 6, tôi có một ứng dụng tôi đang sử dụng Core Data, nhưng không có thư mục nào trong Hỗ trợ ứng dụng cho Trình mô phỏng iPhone iOS 8. Các tập tin và cơ sở dữ liệu sqlite Core Data của tôi đang được lưu trữ ở đâu?
Câu trả lời:
Thư mục giả lập đã được chuyển với Xcode 6 beta sang ...
~/Library/Developer/CoreSimulator
Duyệt thư mục đến thư mục Tài liệu của ứng dụng của bạn khó khăn hơn một chút, ví dụ:
~/Library/Developer/CoreSimulator/Devices/4D2D127A-7103-41B2-872B-2DB891B978A2/data/Containers/Data/Application/0323215C-2B91-47F7-BE81-EB24B4DA7339/Documents/MyApp.sqlite
~/Library/Developer/CoreSimulator/Devices/B2C6629C-998D-4E84-9ADB-06CAF5BA4B89/data/Containers/Data/Application/62593001-FADA-4647-AA80-FE9973956C05/Documents/
#if DEBUG NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]; NSString *aliasPath = [NSString stringWithFormat:@"XCodePaths/%@", appName]; remove([aliasPath UTF8String]); [[NSFileManager defaultManager]createSymbolicLinkAtPath:aliasPath withDestinationPath:DOCS_DIR error:nil]; #endif
Bây giờ tôi đã có một simlink hoạt động, mặc dù iOS8 + XCode6 thay đổi dữ liệu GUID của ứng dụng của tôi mỗi khi tôi xây dựng.
xcrun simctl list
lệnh có thể được sử dụng để xem sự tương ứng giữa các tên giả và UDID thiết bị. Hay cụ thể hơn là xcrun simctl list devices
mệnh lệnh.
Tôi sẽ đề nghị bạn sử dụng SimPholder để tìm các tệp Trình mô phỏng của mình. Đây là một mục trên thanh menu theo dõi các ứng dụng giả lập của bạn và cho phép bạn truy cập trực tiếp vào các thư mục và nội dung của chúng. Thật tuyệt vời.
Tôi thấy ứng dụng SimulatorManager rất hữu ích. Nó đưa bạn trực tiếp đến thư mục ứng dụng của trình giả lập được cài đặt. Tôi đã thử với các trình giả lập 7.1, 8.0 và 8.1.
SimulatorManager cư trú như một biểu tượng trong khay hệ thống và cung cấp tùy chọn "Khởi chạy khi đăng nhập".
Lưu ý : Điều này chỉ hoạt động với Xcode 6 (6.1.1 trong trường hợp của tôi) trở lên.
Mong rằng sẽ giúp!
Để biết nơi tệp .sqlite của bạn được lưu trữ trong AppDelegate.m của bạn, hãy thêm đoạn mã sau
- (NSURL *)applicationDocumentsDirectory
{
NSLog(@"%@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
bây giờ gọi phương thức này trong AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//call here
[self applicationDocumentsDirectory];
}
Tôi vật lộn với điều này một thời gian. Nó trở thành một nỗi đau lớn khi chỉ đơn giản là đến db sqlite địa phương của tôi. Tôi đã viết kịch bản này và biến nó thành một đoạn mã bên trong XCode. Tôi đặt nó bên trong appDidFinishLaunching bên trong appDelegate của tôi.
//xcode 6 moves the documents dir every time. haven't found out why yet.
#if DEBUG
NSLog(@"caching documents dir for xcode 6. %@", [NSBundle mainBundle]);
NSString *toFile = @"XCodePaths/lastBuild.txt"; NSError *err = nil;
[DOCS_DIR writeToFile:toFile atomically:YES encoding:NSUTF8StringEncoding error:&err];
if(err)
NSLog(@"%@", [err localizedDescription]);
NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];
NSString *aliasPath = [NSString stringWithFormat:@"XCodePaths/%@", appName];
remove([aliasPath UTF8String]);
[[NSFileManager defaultManager] createSymbolicLinkAtPath:aliasPath withDestinationPath:DOCS_DIR error:nil];
#endif
Điều này tạo ra một simlink ở gốc ổ đĩa của bạn. (Bạn có thể phải tự tạo thư mục này lần đầu tiên và chmod nó hoặc bạn có thể thay đổi vị trí sang một nơi khác) Sau đó, tôi đã cài đặt plugin xcodeway https://github.com/onmyway133/XcodeWay
Tôi đã sửa đổi nó một chút để nó cho phép tôi chỉ cần nhấn cmd + d và nó sẽ mở một cuộn tìm đến thư mục Tài liệu liên tục của ứng dụng hiện tại của tôi. Bằng cách này, không quan trọng XCode thay đổi đường dẫn của bạn bao nhiêu lần, nó chỉ thay đổi khi chạy và nó cập nhật simlink của bạn ngay lập tức trên mỗi lần chạy.
Tôi hy vọng điều này hữu ích cho những người khác!
Mở công cụ tìm> Thư viện> Nhà phát triển> CoreSimulator> Thiết bị
Sau đó thay đổi biểu tượng Sắp xếp từ công cụ tìm, chọn Ngày thêm
Chọn ứng dụng của bạn> dữ liệu> Container> dữ liệu> Ứng dụng>
chọn ứng dụng của bạn> Tài liệu> Đây là tệp db của bạn
Trong trường hợp của tôi:
/Users/pluto/Library/Developer/CoreSimulator/Devices/A75107D2-A535-415A-865D-978B2555370B/data/Containers/Data/Application/265A12BC-FF5B-4235-B5EF-6022B83754B4/Documents/dboPhotoBucket.sqlite
Nếu không thì làm điều này:
NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
- Nó sẽ in đường dẫn đầy đủ đến thư mục dữ liệu.
Nhanh:
let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
println("App Path: \(dirPaths)")
let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) print("App Path: \(dirPaths)")
Sử dụng Finder -> vào thư mục và nhập basepath đã cho để đến thư mục ứng dụng
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSLog(@"%@",basePath);
Trình mô phỏng đặt tệp vào ~ / Library / Developer / CoreSimulator / Devices / ... nhưng đường dẫn sau / Devices khác nhau đối với mọi người.
Sử dụng phương pháp tiện dụng này. Nó trả về đường dẫn của thư mục tạm thời cho người dùng hiện tại và không có đối số.
NSString * NSTemporaryDirectory ( void );
Vì vậy, trong lớp ViewContoder của tôi, tôi thường đặt dòng này trong viewDidLoad của mình chỉ để tham khảo khi tôi cần lấy tệp được lưu trữ CoreData của mình. Hi vọng điêu nay co ich.
NSLog(@"FILE PATH :%@", NSTemporaryDirectory());
(Lưu ý: để đi đến đường dẫn, từ menu tìm kiếm, nhấp vào Go và gõ ~ / Library để mở thư mục ẩn sau đó trong Cửa sổ Finder, bạn có thể nhấp vào đường dẫn hiển thị trên bảng điều khiển của mình.)
Vị trí này đã một lần nữa thay đổi, nếu sử dụng Swift, hãy sử dụng vị trí này để tìm xem thư mục ở đâu (phần này được sao chép từ tệp AppDelegate.swift mà Apple tạo cho bạn để nếu nó không hoạt động trên máy của bạn, hãy tìm trong tệp đó đúng cú pháp, tệp này hoạt động với tôi bằng trình giả lập Xcode 6.1 và iOS 8):
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
println("Possible sqlite file: \(urls)")
Các mô phỏng được đặt dưới:
~/Library/Developer/CoreSimulator/
Ở đây, chúng được liệt kê dưới dạng thư mục có tên UUID. Sử dụng sắp xếp theo 'Ngày sửa đổi' để tìm cái mới nhất. Bên trong điều hướng đến:
/data/Containers/Data/Application/
Tại đây bạn sẽ nhận được một danh sách tất cả các ứng dụng trên thiết bị đó. Bạn có thể một lần nữa sắp xếp này để có được ứng dụng mới nhất.
LƯU Ý: Xcode thay đổi tên thư mục mỗi khi bạn chạy ứng dụng, vì vậy đừng dựa vào việc tạo bí danh / cắt ngắn trên máy tính để bàn.
Cách dễ nhất là sử dụng ứng dụng ở đây , nó thực hiện mọi thứ tự động.
Tôi đã tạo tập lệnh này để nén ứng dụng mới nhất được xây dựng cho bất kỳ trình giả lập nào và nén nó vào máy tính để bàn.
https://gist.github.com/Gerst20051/8ca49d5afbf09007b3696fab6e9f425c
#!/bin/bash
DESTINATION_DIR="$HOME/Desktop"
APP_PATH=$(find ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Bundle/Application/*/*.app -type d -maxdepth 0 -print0 | xargs -0 ls -td | head -n1)
APP_DIRNAME=$(dirname "$APP_PATH")
APP_BASENAME=$(basename "$APP_PATH")
FILE_NAME="${APP_BASENAME%.*}"
cd "$APP_DIRNAME"
zip -qr "$DESTINATION_DIR/$FILE_NAME.zip" "$APP_BASENAME"
Trong Swift 4 hoặc Swift 5 bạn có thể sử dụng NSHomeDirectory()
.
Cách dễ nhất trong Xcode 10 (hoặc Xcode 11) là tạm dừng ứng dụng của bạn (như khi nó chạm đến điểm dừng) và chạy dòng này trong bảng điều khiển trình gỡ lỗi:
po NSHomeDirectory()
po
là viết tắt của đối tượng in và in hầu hết mọi thứ
1. NSTemporaryDirectory() gives this:
/Users/spokaneDude/Library/Developer/CoreSimulator/Devices/1EE69744-255A-45CD-88F1-63FEAD117B32/data/Containers/Data/Application/199B1ACA-A80B-44BD-8E5E-DDF3DCF0D8D9/tmp
2. remove "/tmp" replacing it with "/Library/Application Support/<app name>/" --> is where the .sqlite files reside
Với Swift 4, bạn có thể sử dụng mã bên dưới để lấy thư mục chính của ứng dụng. Thư mục tài liệu của ứng dụng của bạn ở đó.
print(NSHomeDirectory())
Tôi nghĩ rằng bạn đã biết rằng thư mục chính của ứng dụng của bạn có thể thay đổi, vì vậy nếu bạn không muốn thêm mã bổ sung vào cơ sở mã của mình, SimPholder là một công cụ tuyệt vời dành cho bạn.
Và hơn nữa, bạn có thể tự hỏi là có một công cụ, có thể giúp bạn tiết kiệm thời gian từ việc đóng và mở lại cơ sở dữ liệu SQLite mỗi lần sau khi thư mục chính của ứng dụng của bạn bị thay đổi. Và câu trả lời là có, một công cụ tôi biết là SQLiteFlow . Từ tài liệu của nó, nó nói rằng:
Xử lý tên tập tin cơ sở dữ liệu hoặc thay đổi thư mục. Điều này làm cho SQLiteFlow có thể hoạt động thân thiện với cơ sở dữ liệu SQLite của bạn trong trình giả lập iOS.
Đây là sh cho trình giả lập và ứng dụng được sử dụng lần cuối. Chỉ cần chạy sh và sao chép văn bản in và dán và chạy lệnh để hiển thị trong công cụ tìm.
#!/bin/zsh
lastUsedSimulatorAndApplication=`ls -td -- ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Data/Application/*/ | head -n1`
echo $lastUsedSimulatorAndApplication