Biasanya, file penyimpanan sqlite untuk aplikasi data inti berada di
Library> Application Support> iPhone Simulator> 7.1 (atau versi mana pun yang Anda gunakan)> Aplikasi> (Folder mana pun yang berisi aplikasi Anda)> Dokumen
folder, tetapi saya tidak dapat menemukannya di iOS 8. Saya akan berasumsi bahwa mereka hanya akan menambahkan folder 8.0 di dalam folder iPhone Simulator, tetapi tidak ada. Apakah ada yang bisa menemukannya?
Jawaban:
Saya berhasil menemukan file sqlite, dan di jalur ini sekarang:
(angka dan huruf) adalah singkatan dari folder yang unik untuk aplikasi / komputer Anda, tetapi akan terlihat seperti ini: 779AE2245-F8W2-57A9-8C6D-98643B1CF01A
Saya dapat menemukannya dengan membuka appDelegate.m, menggulir ke bawah ke
- (NSURL *)applicationDocumentsDirectory
metode, dan NSLogging jalur kembali, seperti ini:
// 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]; }
Ini akan memberi Anda jalur unik Anda, membuatnya lebih mudah bagi Anda, karena sulit untuk menemukannya dengan 2 folder / string huruf dan angka tanpa nama.
Swift 4.2:
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) print(paths[0])
sumber
xcrun simctl list
untuk mendapatkan daftar nama simulator dan UUIDnya.Library/Developer/CoreSimulator/Devices/(numbers and letters)/data/Containers/Data/Application/(numbers and letters)/Documents/
tidak lagi benar. Sekarang Anda menemukan .sqlite dan dua file terkait diLibrary/Developer/CoreSimulator/Devices/(numbers and letters)/data/Containers/Data/Application/(numbers and letters)/Library/Application Support/
Tidak ada jawaban yang menyebutkan cara paling sederhana untuk benar-benar mendapatkan lokasi file DB.
Itu bahkan tidak mengharuskan Anda untuk mengubah kode sumber Anda, karena ini adalah saklar run time sederhana di XCode.
Pilih Edit Skema ... di sebelah tombol Jalankan.
Pilih Run / Arguments dan tambahkan dua opsi berikut:
-com.apple.CoreData.SQLDebug 1 -com.apple.CoreData.Logging.stderr 1
Jalankan aplikasi, dan Anda akan melihat di log:
sumber
Coba Langkah 3 Sederhana ini
Salin kode berikut di
didFinishLaunchingWithOptions
Andaappdelegate.m
dan tambahkan titik henti sebelumNSLog()
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSLog(@"%@",[paths objectAtIndex:0]); }
Atau di Swift:
let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) print(paths[0])
2. Buka Finder-> Go -> Buka folder dan tempel jalur yang disalin dari langkah 1
3. Yah !!! Anda berada di Tujuan Anda.
sumber
Jika aplikasi Anda menggunakan Core Data, itu hanya masalah mencari file sqlite di Terminal:
find ~ -name app_db_file_name.sqlite
Hasilnya akan mencantumkan jalur lengkap ke folder simulator yang berisi aplikasi Anda.
sumber
alias myapp_simulator_db="find ~/Library/Developer/CoreSimulator/Devices -name MyApp.sqlite"
. Ini berguna ketika Anda perlu menjalankan perintah ini secara berulang.Saya meretas satu baris ini ( Inti ):
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'" \;
Ini mencetak:
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
Memperbarui:
Seperti yang ditunjukkan seseorang di sini , dimungkinkan juga untuk menjalankan
xcrun simctl list devices
untuk mendapatkan hasil yang serupa:== 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)
sumber
Jika Anda menggunakan Swift , ini akan mengembalikan jalur absolut direktori dokumen:
func applicationDirectoryPath() -> String { return NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as String }
sumber
Saya menulis skrip bash untuk menemukan lokasi folder Aplikasi Anda dan folder Data aplikasi dalam simulator, Anda dapat mengunduhnya di sini . Setelah Anda membuka ritsleting skrip, Anda dapat menavigasi ke folder tempat skrip berada dan menggunakannya. Jika Anda menyebutnya tanpa opsi, itu akan memberi Anda daftar simulator iOS yang diinstal. Anda kemudian dapat menggunakan opsi untuk menemukan program Anda. Penulisan:
./simulatorAppFolders -s "iPad Air" -i iOS-8-0 -a <MyApp>
akan menemukan folder aplikasi dan folder area rumah untuk aplikasi Anda di simulator iPad Air iOS 8. Berikut contohnya:
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
Memperbarui
Ada pembaruan pada skrip asli yang memungkinkan Anda untuk mencari berdasarkan jenis perangkat menggunakan opsi -d. Saya juga telah menulis skrip lain yang membuat serangkaian folder dengan nama yang sesuai sehingga Anda dapat menemukan dokumen aplikasi dan aplikasi Anda. Skrip ini akan membuat folder bernama iOS_SIMULATORS di area beranda Anda dan Anda dapat dengan mudah menavigasi ke aplikasi Anda dari sana.
sumber
Saya dapat menemukan folder simulator dengan output konsol berikutnya:
NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
dalam kasus saya itu (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/
sumber
Berdasarkan jawaban Michaels, ini untuk Swift 3
func applicationDirectoryPath() -> String { return NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as String }
sumber
Untuk Swift 3.0
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) print(paths[0])
Anda bisa mendapatkan lokasi Coredata di Xcode 8.2
sumber
Setelah pembaruan Xcode baru, saya menemukan bahwa file sql sekarang disimpan di folder baru,
/Library/Application Support
ini bisa menjadi situasi yang unik tetapi jika Anda tidak menemukan file sql di folder dokumen cari di sini:~/Library/Developer/CoreSimulator/Devices/[@device_id@]/data/Containers/Data/Application/[@application_id@]/Library/Application Support/
sebelum disimpan di
Documents
folder:~/Library/Developer/CoreSimulator/Devices/[@device_id@]/data/Containers/Data/Application/[@application_id@]/Documents/
sumber
Untuk SWIFT 3:
Salin dan tempel kode ini di didFinishLaunchingWithOptions
print(NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).last! as String)
sumber
Untuk cepat 3
print(NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).last! as String)
sumber
Seperti James Snook, saya membuat skrip saya sendiri untuk memberikan akses yang lebih mudah ke aplikasi simulator. Saya pikir ini bisa berguna bagi banyak orang untuk sampai ke sini, selain saya.
Tidak seperti skripnya, milik saya bukanlah alat pencarian, ini membuat struktur folder yang lengkap (dan dapat dibaca manusia) dengan semua perangkat / runtime, dan menempatkan tautan lunak ke aplikasi di dalamnya.
Anda bisa mendapatkannya di Gist ini .
Jalankan setiap kali Anda menginstal aplikasi di simulator, atau jalankan saja setiap kali Anda akan mengambil aplikasi untuk alasan apa pun (itu akan memperbarui, dan membuka folder perangkat di Finder).
sumber
Jika Anda belum menentukan direktori apa pun, Anda dapat menggunakan kode di bawah ini untuk mencetak direktori default:
cetak (NSPersistentContainer.defaultDirectoryURL ())
sumber
Untuk
iOS 10.0+
Anda bisa menggunakanpersistentContainer.persistentStoreCoordinator.persistentStores.first?.url
Saya telah membuat fungsi Utilitas yang menyalin file sqlite ke lokasi yang Anda inginkan (hanya berfungsi untuk simulator).
Anda bisa menggunakannya seperti
import CoreData let appDelegate = UIApplication.shared.delegate as! AppDelegate UTility.getSqliteTo(destinationPath: "/Users/inderkumarrathore/Desktop", persistentContainer: appDelegate.persistentContainer)
Jika Anda sudah mengakses file sqlite, shm dan wal kemudian jalankan perintah di terminal untuk menggabungkan file WAL ke dalam file sqlite.
$ sqlite3 persistentStore sqlite> PRAGMA wal_checkpoint; Press control + d
Setelah menjalankan perintah di atas, Anda dapat melihat data di file sqlite Anda.
Berikut adalah definisi metode utilitas untuk cepat
/** 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") }
Untuk objektif-c
/** 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"); }
sumber
Swift 4.2.0
Saya telah membuat ekstensi untuk
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 } }
Kemudian saya menggunakannya saat saya menginisialisasi
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 }()
sumber
Cepat 3.x
Temukan fungsi didFinishLaunchingWithOptions di file AppDelegate Anda dan tempelkan kode ini di sana.
let path = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true) print("\(path)")
sumber
Cepat 4.x
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) print(paths[0])
sumber
Swift 4.2.0
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) print(paths[0])
sumber
Anda dapat menggunakan kode berikut.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. **print(persistentContainer.persistentStoreDescriptions)** return true }
Ini akan mencetak lokasi penyimpanan persisten data inti yaitu sqlite
sumber