2009-11-12 14 views

cevap

9

Uygulamaların ana dizin bölümünde bulunan disk alanını bulmak için yararlı olması için this answer on the Apple Dev Forums numaralı telefonu buldum (her aygıtta şu anda iki bölüm olduğunu unutmayın).

Mağaza koleksiyonunuzu almak için NSPersistentStoreCoordinator kullanın.

Kullanım NSFileManager bayt kod yukarıda benim app temsilci yöntemi olduğunu (unsigned long long)

NSArray *allStores = [self.persistentStoreCoordinator persistentStores]; 
unsigned long long totalBytes = 0; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
for (NSPersistentStore *store in allStores) { 
    if (![store.URL isFileURL]) continue; // only file URLs are compatible with NSFileManager 
    NSString *path = [[store URL] path]; 
    DebugLog(@"persistent store path: %@",path); 
    // NSDictionary has a category to assist with NSFileManager attributes 
    totalBytes += [[fileManager attributesOfItemAtPath:path error:NULL] fileSize]; 
} 

Not her mağazaların büyüklüğü elde etmek ve bir özelliği persistentStoreCoordinator sahiptir.

+0

Çok teşekkürler :-) – Nic

9

Kalıcı Veri'deki kalıcı deponuz, dosya sistemindeki bir dosyadır. Çekirdek Veri kümenizi oluştururken bu dosyaya erişir ve muhtemelen bu dosyayı oluşturursunuz. Aşağıdaki kod bayt kalıcı deposunun boyutunu ve dosya sisteminin boş alan, yazdırır: Bu kalıcı mağaza persistentstore.sqlite adlı ve uygulamanız için belgeler dizinde saklanan varsayar

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *persistentStorePath = [documentsDirectory stringByAppendingPathComponent:@"persistentstore.sqlite"]; 

NSError *error = nil; 
NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:persistentStorePath error:&error]; 
NSLog(@"Persistent store size: %@ bytes", [fileAttributes objectForKey:NSFileSize]); 

NSDictionary *fileSystemAttributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:persistentStorePath error:&error]; 
NSLog(@"Free space on file system: %@ bytes", [fileSystemAttributes objectForKey:NSFileSystemFreeSize]); 

. Kalıcı mağazanızın adından emin değilseniz, NSPersistentStoreCoordinator'unuzu nereye ayırdığınızı ve init yaptığınızı bulun. Dükkanın adı, oradaki kodda bir yerlerde belirtilmelidir.

Dosya ve dosya sistemi öznitelikleri sözlüklerinden geri aldığınız değerlerin NSNumbers olduğunu unutmayın, bu nedenle dosya boyutlarıyla bu şekilde çalışmak istiyorsanız bunları skaler türlere dönüştürmeniz gerekir. Dikkat edilmesi gereken bir şey, bu değerlerin bayt cinsinden olmasıdır, bu nedenle çoklu gigabaytlı dosya sistemleri için 32 bit tamsayı veri türleri ile sayı boyutu sınırlamalarına girebilirsiniz.

+0

Teşekkürler Brad. Onun yararlı ... – Nic

+0

@Brad: Sistemin bir uygulamanın dosya sisteminde kalan boş alanın tam (veya yakın) kullanımını kullanmasına izin verip vermediğini biliyor musunuz? Veya sistem boşluğunun uygulamaya tahsis ettiği maksimum alan mı? – mahboudz

+0

Bir aygıtta, dahili flash bellekteki toplam boş alanın geri döndüğü görülüyor (döndürülen bayt değeri, iTunes tarafından bildirilen boş alanla eşleşiyor). Uygulamanın çalışmak için o kadar alana sahip olduğunu varsayalım. –

1

Nerede gördüğümü bilmiyorum, ancak veri tabanındaki girdileri kaldırmanın veritabanı dosyasını daraltmayacağına inanıyorum. SQLite depolamayı dahili olarak geri alır ve yeniden kullanır. (Bu, RDBMS'lerin tipik bir örneğidir.) Kompakt hale getirecek bir yerde bir komut satırı aracı olduğuna inanıyorum, ancak bu uygulama sizin veri kümesine dosya göndermek istediğinde size yardımcı olmayacaktır (örneğin, işletim sistemi için alan kazanmak için). .

Bu nedenle, dosya boyutu yöntemi, veritabanının yüksek-su işareti boyutu hakkında size bir fikir verirken, veri kümeniz tarafından kullanılan depolama miktarını belirtmeniz gerekmez.

İlgili konular