Xcode 6'da, Temel Verileri kullandığım bir uygulamam var, ancak iOS 8 iPhone Simulator için Uygulama Desteği'nde klasör yok. Dosyalarım ve Core Data sqlite veritabanı nerede saklanıyor?
Xcode 6'da, Temel Verileri kullandığım bir uygulamam var, ancak iOS 8 iPhone Simulator için Uygulama Desteği'nde klasör yok. Dosyalarım ve Core Data sqlite veritabanı nerede saklanıyor?
Yanıtlar:
Simülatör dizini Xcode 6 beta ile taşındı ...
~/Library/Developer/CoreSimulator
Dizine uygulamanızın Belgeler klasörüne göz atmak biraz daha zahmetlidir, ör.
~/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
İOS8 + XCode6, her oluşturduğumda Uygulamamın Veri GUID'ini değiştirmesine rağmen, şimdi çalışan bir simlink var.
xcrun simctl list
Komut simülatörü adları ve cihaz UDID'ler arasındaki ilişkiyi görmek için kullanılabilir. Veya daha spesifik olarak xcrun simctl list devices
komut.
Simulator dosyalarınızı bulmak için SimP sahiplerini kullanmanızı öneririm . Simülatör uygulamalarınızı izleyen ve doğrudan klasörlerine ve içeriğine gitmenizi sağlayan bir menü çubuğu öğesidir. Bu harika.
SimulatorManager uygulamasını çok kullanışlı buldum . Doğrudan kurulu simülatörlerin uygulama klasörüne götürür. 7.1, 8.0 ve 8.1 simülatörleri ile denedim.
SimulatorManager sistem tepsisinde bir simge olarak bulunur ve "Girişte Başlat" seçeneği sunar.
Not : Bu yalnızca Xcode 6 (benim durumumda 6.1.1) ve üstü ile çalışır.
Umarım yardımcı olur!
.Sqlite dosyanızın AppDelegate.m dosyasında nerede depolandığını öğrenmek için aşağıdaki kodu ekleyin
- (NSURL *)applicationDocumentsDirectory
{
NSLog(@"%@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
şimdi bu yöntemi AppDelegate.m'de çağırın
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//call here
[self applicationDocumentsDirectory];
}
Bir süre bununla güreştim. Sadece yerel sqlite db almak için büyük bir acı oldu. Bu komut dosyasını yazdım ve XCode içinde bir kod snippet'i yaptım. Ben appDidFinishLaunching benim appDelegate içine yerleştirin.
//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
Bu, sürücünüzün kökünde bir simlink oluşturur. (Bu klasörü ilk kez kendiniz oluşturmanız ve chmod yapmanız gerekebilir veya konumu başka bir yere değiştirebilirsiniz) Sonra xcodeway eklentisini yükledim https://github.com/onmyway133/XcodeWay
Biraz değiştirdim, böylece cmd + d tuşlarına basmamı sağlayacak ve mevcut uygulamamın kalıcı Belgeler dizinine bir bulucu sarıcı açacak. Bu şekilde, XCode'un yolunuzu kaç kez değiştirdiği önemli değil, sadece çalışma sırasında değişir ve simlinkinizi her çalıştırmada hemen günceller.
Umarım bu diğerleri için yararlıdır!
Bulucuyu aç> Kütüphane> Geliştirici> CoreSimulator> Cihazlar
Ardından bulucudan Düzenlemeyi Değiştir simgesi Eklenme Tarihi'ni seçin
Uygulamanızı seçin> veriler> Kapsayıcı> veri> Uygulamalar>
uygulamanızı seçin> Belgeler> İşte db dosyanız
Benim durumumda:
/Users/pluto/Library/Developer/CoreSimulator/Devices/A75107D2-A535-415A-865D-978B2555370B/data/Containers/Data/Application/265A12BC-FF5B-4235-B5EF-6022B83754B4/Documents/dboPhotoBucket.sqlite
Aksi takdirde bunu yapın:
NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
- Veri klasörünün tam yolunu yazdıracaktır.
Swift:
let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
println("App Path: \(dirPaths)")
let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) print("App Path: \(dirPaths)")
Finder'ı kullanın -> klasöre gidin ve uygulama klasörlerine ulaşmak için verilen temel yolu girin
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSLog(@"%@",basePath);
Simülatör dosyayı ~ / Library / Developer / CoreSimulator / Devices / ... içine yerleştirir, ancak / Devices öğesinden sonraki yol herkes için farklıdır.
Bu kullanışlı yöntemi kullanın. Geçerli kullanıcı için geçici dizinin yolunu döndürür ve hiçbir bağımsız değişken almaz.
NSString * NSTemporaryDirectory ( void );
Yani benim ViewController sınıf ben genellikle benim CoreData saklanan dosya kapmak gerektiğinde sadece bir referans için benim viewDidLoad bu satırı koymak. Bu yardımcı olur umarım.
NSLog(@"FILE PATH :%@", NSTemporaryDirectory());
(Not: yola gitmek için, bulucu menüsünden Git'e tıklayın ve gizli dizini açmak için ~ / Library yazın ve Finder Penceresinde konsolunuzda gösterilen yolu tıklayabilirsiniz.)
Bu konum bir kez daha değişti, Swift kullanıyorsanız, klasörün nerede olduğunu bulmak için bunu kullanın (bu, Apple'ın sizin için oluşturduğu AppDelegate.swift dosyasından kopyalanır, böylece makinenizde çalışmazsa, doğru sözdizimi için bu dosya, Xcode 6.1 ve iOS 8 simülatörü kullanılarak benimki üzerinde çalışır):
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
println("Possible sqlite file: \(urls)")
Simülatörler:
~/Library/Developer/CoreSimulator/
Burada, UUID isimleri olan dizinler olarak listelenirler. En sonuncuyu bulmak için 'Değiştirme tarihi' ile sıralamayı kullanın. Içinde şuraya gidin:
/data/Containers/Data/Application/
Burada o cihazdaki tüm uygulamaların bir listesini alacaksınız. En son uygulamayı almak için bunu tekrar sıralayabilirsiniz.
NOT: Xcode, uygulamayı her çalıştırdığınızda dizin adını değiştirir, bu nedenle masaüstünde takma ad / kısayollar yapmaya güvenmeyin.
En kolay yol, her şeyi otomatik olarak yapan uygulamayı burada kullanmaktır .
Herhangi bir simülatör için oluşturulan en son uygulamayı ve masaüstüne zipleyecek bu komut dosyasını oluşturdum.
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 veya Swift 5'de kullanabilirsiniz NSHomeDirectory()
.
Xcode 10'daki (veya Xcode 11) en kolay yol, uygulamanızı duraklatmak (bir kesme noktasına çarptığında olduğu gibi) ve bu satırı hata ayıklayıcı konsolunda çalıştırmaktır:
po NSHomeDirectory()
po
yazdırma nesnesini temsil eder ve birçok şeyi yazdırır
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 ile, uygulamanızın ana dizinini almak için aşağıdaki kodu kullanabilirsiniz. Uygulamanızın belge dizini orada.
print(NSHomeDirectory())
Uygulamanızın ana dizininin değiştirilebilir olduğunu zaten biliyorsunuzdur, bu nedenle kod tabanınıza ek kod eklemek istemiyorsanız, SimPholder sizin için güzel bir araçtır.
Dahası, uygulamanızın ana dizini her değiştikten sonra aynı SQLite veritabanını kapatıp yeniden açarak zaman kazanmanıza yardımcı olabilecek bir araç olduğunu merak edebilirsiniz. Ve cevap evet, bildiğim bir araç SQLiteFlow . Belgesinden şunu söylüyor:
Veritabanı dosya adı veya dizin değişikliklerini işleyin. Bu, SQLiteFlow'un iOS simülatöründeki SQLite veritabanınızla uyumlu çalışmasını sağlar.
İşte son kullanılan simülatör ve uygulama için sh . Sh'yi çalıştırın ve basılı metni kopyalayın ve bulucuda göstermek için yapıştırın ve çalıştırın.
#!/bin/zsh
lastUsedSimulatorAndApplication=`ls -td -- ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Data/Application/*/ | head -n1`
echo $lastUsedSimulatorAndApplication