ข้อมูลหลักตำแหน่งไฟล์ Sqlite


92

โดยปกติไฟล์เก็บ sqlite สำหรับแอปข้อมูลหลักจะอยู่ใน

ไลบรารี> การสนับสนุนแอปพลิเคชัน> iPhone Simulator> 7.1 (หรือเวอร์ชันใดก็ตามที่คุณใช้)> แอปพลิเคชัน> (โฟลเดอร์ใดก็ตามที่มีแอปของคุณ)> เอกสาร

แต่ฉันไม่พบใน IOS 8 ฉันคิดว่าพวกเขาจะเพิ่มโฟลเดอร์ 8.0 ภายในโฟลเดอร์ iPhone Simulator แต่ไม่มีอยู่ มีใครสามารถค้นหาได้หรือไม่


2
ฉันค่อนข้างแน่ใจว่าคำถามของคุณซ้ำกันเพราะฉันถามคำถามของคุณมากกว่าหนึ่งสัปดาห์ก่อนที่คุณจะถูกถาม ถ้าคุณให้ฉันได้รับเครดิตสำหรับคำถามนี้ถือว่าเป็นคำถามแรกที่ฉันเคยถามและดูเหมือนว่าคุณมีชื่อเสียงแล้ว @HenryGlendening
enlyte

ดูวิธีการตรวจสอบ dbpath stackoverflow.com/a/27358291/3840428
Nagarjun

ตามนี้เลย… stackoverflow.com/
questions/24290989/

2
มีใครทราบวิธีรับไฟล์ CoreData จากอุปกรณ์จริงบ้าง? ฉันเคยทำสิ่งนี้ผ่าน iTunes ใน Xcode เวอร์ชันเก่า แต่เนื่องจาก Xcode 8 / iOS10 ฉันไม่คิดว่าไฟล์ CoreData จะถูกเก็บไว้ในไดเรกทอรีเอกสารของแอปจึงมองไม่เห็นใน iTunes มีวิธีรับไฟล์ CoreDate จากอุปกรณ์บนคอมพิวเตอร์ของคุณหรือไม่?
Bocaxica

1
ฉันไม่รู้ว่าทำไมพวกเขาถึงยังคงเคลื่อนไหวเช่นนี้ พวกเขาควรวางไว้ที่ไหนสักแห่งและทิ้งไว้
RegularExpression

คำตอบ:


134

ฉันจัดการเพื่อค้นหาไฟล์ sqlite และตอนนี้อยู่ในเส้นทางนี้:

Library / Developer / CoreSimulator / Devices / (ตัวเลขและตัวอักษร) / data / Containers / Data / Application / (ตัวเลขและตัวอักษร) / Documents /

(ตัวเลขและตัวอักษร) ย่อมาจากโฟลเดอร์ที่ไม่ซ้ำกับแอพ / คอมพิวเตอร์ของคุณ แต่จะมีลักษณะดังนี้: 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 ของพวกเขา
Sandy Chapman

1
โปรดทราบว่าหากคุณใช้ฐานข้อมูลที่แชร์สำหรับกลุ่มแอป (ตัวอย่างเช่นเมื่อคุณใช้ส่วนขยาย) เส้นทางคือ Library / Developer / CoreSimulator / Devices / $ number / data / Containers / Shared / AppGroup / $ number / Name.sqlite
andreacipriani

7
โปรดทราบว่าใน2019 , Library/Developer/CoreSimulator/Devices/(numbers and letters)/data/Containers/Data/Application/(numbers and letters)/Documents/ไม่เป็นความจริง ตอนนี้คุณพบ. sqlite และสองไฟล์ที่เกี่ยวข้องในLibrary/Developer/CoreSimulator/Devices/(numbers and letters)/data/Containers/Data/Application/(numbers and letters)/Library/Application Support/
Gang Fang

@GangFang ฉันกำลังพยายามแปลงรหัส Objective C ของฉันซึ่งสร้างใน Xcode 7 เป็นเวอร์ชันที่รวดเร็วล่าสุดและสร้างโครงการใหม่ดังนั้นฉันจะย้ายไฟล์. sqlite สองไฟล์นี้ไปไว้ในที่เดียวกันได้อย่างไร
Sanjay Shah

90

ไม่มีคำตอบใดที่กล่าวถึงวิธีที่ง่ายที่สุดในการรับตำแหน่งของไฟล์ DB

ไม่จำเป็นต้องให้คุณแก้ไขซอร์สโค้ดของคุณด้วยซ้ำเนื่องจากเป็นการสลับเวลาทำงานอย่างง่ายใน XCode

  1. เลือก Edit Scheme ... ถัดจากปุ่ม Run

    แก้ไขรูปแบบ

  2. เลือกเรียกใช้ / อาร์กิวเมนต์และเพิ่มสองตัวเลือกต่อไปนี้:

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

    ตัวเลือก

  3. เรียกใช้แอปและคุณจะเห็นในบันทึก:

    บันทึก


2
นี่เป็นทางออกที่ง่ายและดีที่สุด ขอบคุณ!
Omid Ariyan

สำหรับฉันบันทึกไม่ปรากฏขึ้นคุณสามารถช่วยฉันได้ไหม
ออกัสโต้

@ สิงหาคมฉันช่วยคุณไม่ได้ที่นี่ แต่ถ้าคุณถามคำถามใหม่เกี่ยวกับเรื่องนี้ผู้คนอาจตอบได้และช่วยคุณได้
hyperknot

ตอบโจทย์มาก! นี่ควรเป็นคำตอบที่ได้รับการยอมรับ มีวิธีใดบ้างที่คุณทราบในการเปลี่ยนสีของเอาต์พุตนี้ในคอนโซลนอกเหนือจากการตั้งค่า Xcode คงจะดีไม่น้อยถ้ามันโดดเด่นกว่านี้
Coreyd303

ขอบคุณสำหรับคำแนะนำ! เส้นทางเปลี่ยนแปลงตลอดเวลาสำหรับฉันตอนนี้ (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. คัดลอกรหัสต่อไปนี้ใน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])

ป้อนคำอธิบายภาพที่นี่

2. เปิด Finder-> Go -> ไปที่โฟลเดอร์และวางเส้นทางที่คัดลอกมาจากขั้นตอนที่ 1

ป้อนคำอธิบายภาพที่นี่

3. ย๊า !!! คุณอยู่ในปลายทางของคุณ


2
สำหรับการใช้ swift3: NSSearchPathForDirectoriesInDomains (.applicationSupportDirectory, .userDomainMask, true)
Yohst

38

หากแอปของคุณใช้ Core Data เพียงแค่ค้นหาไฟล์ sqlite ใน Terminal เท่านั้น:

find ~ -name app_db_file_name.sqlite

ผลลัพธ์จะแสดงรายการเส้นทางแบบเต็มไปยังโฟลเดอร์จำลองที่มีแอปของคุณ


2
@AlexWei ฉันหวังว่า Apple จะเพิ่มปุ่มบนเมนูไฟล์เพื่อ "เปิดเผยโฟลเดอร์เอกสาร Simulator ในตัวค้นหา" หรือสิ่งที่คล้ายกัน ดูเหมือนว่าไร้สาระที่ก็ยังคงไม่ได้มีการพิจารณาพวกเขาให้การเปลี่ยนแปลงที่พวกเขาจะจัดเก็บไฟล์ ...
DiscDev

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

13

ผมเขียนสคริปต์ทุบตีสำหรับการค้นหาตำแหน่งที่ตั้งของโฟลเดอร์แอพลิเคชันของคุณและโฟลเดอร์ 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 ในพื้นที่บ้านของคุณและคุณสามารถไปที่แอปพลิเคชันของคุณได้อย่างง่ายดายจากที่นั่น


สมบูรณ์แบบฉันแก้ไขสคริปต์ของคุณเพื่อสร้างอีกอันที่สร้างข้อมูลจำลองทั้งหมดของแอปบางแอป ขอบคุณมากเจมส์!
Martin

ขอบคุณ! ทางออกที่ยอดเยี่ยมสำหรับ 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/

6

จากคำตอบของ Michaels นี่คือสำหรับ Swift 3

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

ทางออกเดียวที่นี่!
Fattie

5

สำหรับ Swift 3.0

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

คุณจะได้รับตำแหน่งของ Coredata ใน Xcode 8.2


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)

สิ่งนี้ช่วยฉันได้ แต่เมื่อฉันพยายามไปที่เส้นทางนั้นผ่านเทอร์มินัลมันบอกว่า: ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว แต่เมื่อฉันพยายามที่จะ goto ตัวเลือกโฟลเดอร์มันมีอยู่จริง
Qadir Hussain

สิ่งนี้ใช้ได้ผลกับฉันบน OSX ฉันต้องการไปอีก 1 ไดเร็กทอรีภายในไดเร็กทอรี "Application Support" ที่ชื่อ <my app name> เพื่อปรับไฟล์. sqlite
Jacksonsox


2

เช่นเดียวกับJames Snookฉันสร้างสคริปต์ของตัวเองเพื่อให้เข้าถึงแอปจำลองได้ง่ายขึ้น ฉันคิดว่ามันมีประโยชน์สำหรับหลาย ๆ คนที่มาที่นี่นอกจากฉัน

ซึ่งแตกต่างจากสคริปต์ของเขาของฉันไม่ใช่เครื่องมือค้นหามันสร้างโครงสร้างโฟลเดอร์ที่สมบูรณ์ (และมนุษย์สามารถอ่านได้) พร้อมกับอุปกรณ์ / รันไทม์ทั้งหมดและใส่ซอฟต์ลิงก์ไปยังแอพในนั้น

คุณสามารถรับได้ใน Gistนี้

เรียกใช้ทุกครั้งที่คุณติดตั้งแอปในโปรแกรมจำลองหรือเพียงแค่เรียกใช้ทุกครั้งที่คุณจะดึงแอปไม่ว่าด้วยเหตุผลใดก็ตาม (จะอัปเดตและเปิดโฟลเดอร์อุปกรณ์ใน Finder)


คุณสามารถปรับสคริปต์นี้ให้ทำงานบางอย่างโดยอัตโนมัติ แต่ฉันต้องบอกว่าแอพ GUI นี้ฉันเพิ่งพบว่าเสียงเป็นทางเลือกที่มีประโยชน์จริงๆหากคุณต้องการเข้าถึงโฟลเดอร์ของแอพ :)
fbeeper

นี่ก็ค่อนข้างดีเช่นกัน แต่ฉันชอบสคริปต์ที่ 2 ที่โพสต์โดย 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");
}

1

สวิฟต์ 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
    }()

0

สวิฟต์ 3.x

ค้นหาฟังก์ชันdidFinishLaunchingWithOptionsในไฟล์AppDelegateของคุณและวางโค้ดนี้ที่นั่น

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.