ใน Xcode 6 ฉันมีแอพที่ฉันใช้ Core Data อยู่ แต่ไม่มีโฟลเดอร์ใน Application Support สำหรับ iOS 8 iPhone Simulator ไฟล์และฐานข้อมูล Core Data sqlite ของฉันถูกเก็บไว้ที่ไหน?
ใน Xcode 6 ฉันมีแอพที่ฉันใช้ Core Data อยู่ แต่ไม่มีโฟลเดอร์ใน Application Support สำหรับ iOS 8 iPhone Simulator ไฟล์และฐานข้อมูล Core Data sqlite ของฉันถูกเก็บไว้ที่ไหน?
คำตอบ:
ไดเรกทอรีจำลองถูกย้ายไปพร้อมกับ Xcode 6 เบต้าไปที่ ...
~/Library/Developer/CoreSimulator
การเรียกดูไดเรกทอรีไปยังโฟลเดอร์เอกสารในแอปของคุณนั้นค่อนข้างลำบากกว่าเช่น
~/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
ตอนนี้ฉันมีซิมลิงค์ที่ใช้งานได้แม้ว่า iOS8 + XCode6 จะเปลี่ยน Data GUID ของแอปทุกครั้งที่ฉันสร้าง
xcrun simctl list
คำสั่งที่สามารถใช้เพื่อดูความสอดคล้องระหว่างชื่อจำลองและ UDIDs อุปกรณ์ หรือโดยเฉพาะxcrun simctl list devices
คำสั่ง
ฉันขอแนะนำให้คุณใช้SimPholdersเพื่อค้นหาไฟล์ Simulator ของคุณ มันเป็นรายการในแถบเมนูที่ติดตามแอปจำลองของคุณและช่วยให้คุณไปยังโฟลเดอร์และเนื้อหาได้โดยตรง มันเจ๋งมาก.
ฉันพบว่าแอพพลิเคชั่นSimulatorManagerมีประโยชน์มาก มันจะนำคุณไปยังโฟลเดอร์แอปพลิเคชันของตัวจำลองที่ติดตั้งโดยตรง ฉันได้ลองกับเครื่องจำลอง 7.1, 8.0 และ 8.1
SimulatorManager อยู่เป็นไอคอนในซิสเต็มเทรย์และมีตัวเลือก "เรียกใช้เมื่อเข้าสู่ระบบ"
หมายเหตุ : ใช้งานได้เฉพาะกับ Xcode 6 (6.1.1 ในกรณีของฉัน) ขึ้นไป
หวังว่าจะช่วย!
หากต้องการทราบว่าไฟล์. sqlite ของคุณถูกเก็บไว้ที่ใดใน AppDelegate.m ให้เพิ่มรหัสต่อไปนี้
- (NSURL *)applicationDocumentsDirectory
{
NSLog(@"%@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
ตอนนี้เรียกวิธีนี้ใน AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//call here
[self applicationDocumentsDirectory];
}
สิ่งนี้ใช้ได้กับฉันอย่างรวดเร็ว:
let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
println("App Path: \(dirPaths)")
ฉันปล้ำกับบางครั้ง มันกลายเป็นความเจ็บปวดครั้งใหญ่ที่จะไปที่ sqlite db ในพื้นที่ของฉัน ฉันเขียนสคริปต์นี้และทำให้เป็นข้อมูลโค้ดใน XCode ฉันวางไว้ในแอพของฉัน
//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
สิ่งนี้จะสร้าง simlink ที่รากของไดรฟ์ของคุณ (คุณอาจต้องสร้างโฟลเดอร์นี้ด้วยตัวเองเป็นครั้งแรกและเปลี่ยนมันหรือคุณสามารถเปลี่ยนตำแหน่งเป็นที่อื่น) จากนั้นฉันติดตั้งปลั๊กอินxcodeway https://github.com/onmyway133/XcodeWay
ฉันแก้ไขมันเล็กน้อยเพื่อให้ฉันกด cmd + d แล้วมันจะเปิดตัวค้นหาไปยังไดเรกทอรีเอกสารของแอปพลิเคชันปัจจุบันของฉัน ด้วยวิธีนี้ไม่ว่า XCode จะเปลี่ยนเส้นทางของคุณกี่ครั้ง แต่จะเปลี่ยนเฉพาะเมื่อรันและจะอัปเดต simlink ของคุณทันทีในการรันแต่ละครั้ง
ฉันหวังว่านี่จะเป็นประโยชน์สำหรับคนอื่น ๆ !
เปิดตัวค้นหา> ไลบรารี> นักพัฒนา> CoreSimulator> อุปกรณ์
จากนั้นเปลี่ยนไอคอนการจัดเรียงจากตัวค้นหาเลือกเพิ่มวันที่
เลือกแอปของคุณ> ข้อมูล> คอนเทนเนอร์> ข้อมูล> แอปพลิเคชัน>
เลือกแอปของคุณ> เอกสาร> นี่คือไฟล์ db ของคุณ
ในกรณีของฉัน:
/Users/pluto/Library/Developer/CoreSimulator/Devices/A75107D2-A535-415A-865D-978B2555370B/data/Containers/Data/Application/265A12BC-FF5B-4235-B5EF-6022B83754B4/Documents/dboPhotoBucket.sqlite
มิฉะนั้นทำสิ่งนี้:
NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
- มันจะพิมพ์เส้นทางแบบเต็มไปยังโฟลเดอร์ข้อมูล
สวิฟท์:
let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
println("App Path: \(dirPaths)")
let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) print("App Path: \(dirPaths)")
ใช้ Finder -> ไปที่โฟลเดอร์และป้อน basepath ที่กำหนดเพื่อเข้าถึงโฟลเดอร์แอปพลิเคชัน
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSLog(@"%@",basePath);
ตัวจำลองวางไฟล์ไว้ใน ~ / Library / Developer / CoreSimulator / Devices / ... แต่เส้นทางหลังจาก / Devices นั้นแตกต่างกันสำหรับทุกคน
ใช้วิธีการที่สะดวกนี้ ส่งคืนพา ธ ของไดเร็กทอรีชั่วคราวสำหรับผู้ใช้ปัจจุบันและไม่รับอาร์กิวเมนต์
NSString * NSTemporaryDirectory ( void );
ดังนั้นในชั้นเรียน ViewController ของฉันฉันมักจะใส่บรรทัดนี้ไว้ใน viewDidLoad ของฉันเพื่อการอ้างอิงเมื่อฉันต้องการที่จะคว้าไฟล์ CoreData ของฉันที่เก็บไว้ หวังว่านี่จะช่วยได้
NSLog(@"FILE PATH :%@", NSTemporaryDirectory());
(หมายเหตุ: หากต้องการไปยังเส้นทางจากเมนูค้นหาให้คลิกที่ไปและพิมพ์ ~ / Library เพื่อเปิดไดเรกทอรีที่ซ่อนอยู่จากนั้นในหน้าต่างค้นหาคุณสามารถคลิกบนเส้นทางที่แสดงบนคอนโซลของคุณ)
ตำแหน่งนี้มีการเปลี่ยนแปลงอีกครั้งหากใช้ Swift ให้ใช้สิ่งนี้เพื่อค้นหาว่าโฟลเดอร์อยู่ที่ใด (จะถูกคัดลอกจากไฟล์ AppDelegate.swift ที่ Apple สร้างให้คุณดังนั้นถ้ามันไม่ทำงานบนเครื่องของคุณให้ค้นหา ไฟล์นั้นสำหรับไวยากรณ์ที่ถูกต้องใช้งานได้กับฉันโดยใช้ Xcode 6.1 และ iOS 8 simulator)
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
println("Possible sqlite file: \(urls)")
ตัวจำลองอยู่ภายใต้:
~/Library/Developer/CoreSimulator/
ที่นี่พวกเขาจะถูกระบุว่าเป็นไดเรกทอรีที่มีชื่อ UUID ใช้จัดเรียงตาม 'แก้ไขวันที่' เพื่อค้นหาไฟล์ล่าสุด ภายในนำทางไปยัง:
/data/Containers/Data/Application/
ที่นี่คุณจะได้รับรายการแอปพลิเคชันทั้งหมดในอุปกรณ์นั้น คุณสามารถเรียงลำดับนี้อีกครั้งเพื่อรับแอปล่าสุด
หมายเหตุ: Xcode เปลี่ยนชื่อไดเรกทอรีทุกครั้งที่คุณเรียกใช้แอปดังนั้นอย่าพึ่งพาการใช้นามแฝง / ทางลัดบนเดสก์ท็อป
วิธีที่ง่ายที่สุดคือใช้แอปที่นี่ซึ่งทำทุกอย่างโดยอัตโนมัติ
ฉันสร้างสคริปต์นี้ที่จะซิปแอพล่าสุดที่สร้างขึ้นสำหรับเครื่องมือจำลองใด ๆ และซิปไปยังเดสก์ท็อป
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"
ใน Swift 4 หรือ Swift 5 คุณสามารถใช้ได้ NSHomeDirectory()
ใช้ได้
วิธีที่ง่ายที่สุดใน Xcode 10 (หรือ Xcode 11) คือการหยุดแอปของคุณชั่วคราว (เช่นเมื่อมันถึงจุดพัก) และเรียกใช้บรรทัดนี้ในคอนโซลดีบักเกอร์:
po NSHomeDirectory()
po
ย่อมาจากวัตถุพิมพ์และพิมพ์สิ่งต่าง ๆ ส่วนใหญ่
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
ด้วย Swift 4 คุณสามารถใช้รหัสด้านล่างเพื่อรับไดเรกทอรีบ้านของแอปของคุณ ไดเรกทอรีเอกสารของแอปของคุณอยู่ในนั้น
print(NSHomeDirectory())
ฉันคิดว่าคุณรู้แล้วว่าโฮมไดเร็กตอรี่ของแอพของคุณสามารถเปลี่ยนแปลงได้ดังนั้นหากคุณไม่ต้องการเพิ่มรหัสเพิ่มเติมลงในฐานข้อมูลของคุณSimPholderเป็นเครื่องมือที่ดีสำหรับคุณ
และยิ่งไปกว่านั้นคุณอาจสงสัยว่ามีเครื่องมือที่ช่วยให้คุณประหยัดเวลาจากการปิดและเปิดฐานข้อมูล SQLite เดียวกันทุกครั้งหลังจากที่เปลี่ยนไดเรกทอรีหลักของแอป และคำตอบคือใช่เครื่องมือที่ผมรู้ก็คือSQLiteFlow จากเอกสารมันบอกว่า:
จัดการกับชื่อไฟล์ฐานข้อมูลหรือการเปลี่ยนแปลงไดเรกทอรี สิ่งนี้ทำให้ SQLiteFlow สามารถทำงานกับฐานข้อมูล SQLite ของคุณในโปรแกรมจำลอง iOS ได้
นี่คือshสำหรับโปรแกรมจำลองการใช้งานล่าสุดและแอปพลิเคชัน เพียงแค่เรียกใช้ sh และคัดลอกข้อความที่พิมพ์และวางและเรียกใช้คำสั่งเพื่อแสดงในตัวค้นหา
#!/bin/zsh
lastUsedSimulatorAndApplication=`ls -td -- ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Data/Application/*/ | head -n1`
echo $lastUsedSimulatorAndApplication