2010-10-28 30 views
7

Tôi có khoảng 60 hình ảnh tôi muốn lưu trữ trong Dữ liệu cốt lõi, 30 trong số đó là hình đại diện và có tiền tố là avt_filename_00X.png và 30 trong số chúng nhỏ hơn và có tiền tố khác nhau. Thay vì lưu trữ tất cả các hình ảnh dưới dạng BLOB trong Core Data/SQLite, tôi muốn lưu trữ đường dẫn cho mỗi hình ảnh được tìm thấy (giống như cách bạn lưu trữ đường dẫn hình ảnh cho cơ sở dữ liệu MySQL).Nhận đường dẫn hình ảnh từ NSBundle trong Mục tiêu C?

Tuy nhiên tôi không chắc chắn cách lấy đường dẫn của hình ảnh như được tìm thấy trong NSBundle.

Tôi có thể lấy đường dẫn đến NSDocumentDirectory qua:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSFileManager *fileManager = [NSFileManager defaultManager]; 
[fileManager fileExistsAtPath:documentsDirectory]; 

NSLog(@"documentsDirectory = %@", documentsDirectory); 

Và tôi có thể tải hình ảnh và thêm nó vào một mảng.

if (qty == 0) 
{ 
    //NSLog(@"fileToLoad = %@", fileToLoad); 

    UIImage *img = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileToLoad ofType:fileExt]]; 

    [self.avtList addObject:img]; 

    [img release]; 

} else { 

    // load multiple image into an array 
    // not coded yet 
} 

Nhưng, những gì tôi không rõ là:

  1. Làm thế nào để lấy đường dẫn nơi máy tính tìm thấy hình ảnh một lần của nó bên trong NSBundle?

  2. Làm cách nào để đảm bảo rằng đường dẫn sẽ hoạt động khi ứng dụng trên thiết bị?

Ý tưởng sẽ là lấy tất cả hình ảnh được lưu trữ trong một mảng và sau đó đẩy chúng vào Core Data/SQLite sau đó.

Trả lời

25

Cách đúng để có được đầy đủ đường dẫn đến một nguồn tài nguyên trong gói chính là:

[[NSBundle mainBundle] pathForResource:@"avt_filename_00X" ofType:@"png"] 

(hoặc bạn có thể cung cấp các chuỗi rỗng cho 'ofType' nếu bạn muốn bao gồm phần mở rộng trong tài nguyên tên)

Nhưng không nơi nào trong tài liệu là đường dẫn được đảm bảo duy trì giống nhau trên các thiết bị, hệ điều hành lặp lại, v.v. Đó là đường dẫn đến tệp đó từ gói ứng dụng trong môi trường hiện tại, được đảm bảo vẫn hợp lệ trong suốt thời gian chỉ chạy ứng dụng này.

Vì đường dẫn đến ứng dụng, và do đó đến tài nguyên của nó, không được bảo đảm để giữ nguyên, tôi nghĩ rõ ràng là không an toàn khi đặt nó trong cơ sở dữ liệu SQL bằng bất kỳ phương tiện nào. Có lẽ bạn có thể áp dụng một sơ đồ theo đó một tên tập tin bắt đầu trong/là một đường dẫn đầy đủ, một cái không có/lúc bắt đầu được giả định là trong bó, nghĩa là bạn có thể áp dụng logic ở bên ngoài cơ sở dữ liệu không? Không.

+1

Vâng, điều đó có ý nghĩa. Tôi nghĩ rằng tôi sẽ chỉ lưu trữ tên tệp trong cơ sở dữ liệu và sau đó sử dụng mã NSBundle của bạn ở giai đoạn sau để lấy lại hình ảnh. – zardon

2

Làm cách nào để đảm bảo rằng đường dẫn sẽ hoạt động khi ứng dụng trên thiết bị?

Trong đó có sự chà xát: bạn không thể. Bạn sẽ tốt nhất để cho phép các đường dẫn được xử lý nhanh chóng và có thể chỉ lưu trữ tên tệp thay thế.

+0

Ồ tôi không biết điều đó. Tôi nghĩ bạn có thể sử dụng lưu trữ đường dẫn đầy đủ và sau đó sử dụng nó. Nếu tôi viết nó để lưu trữ tên tập tin và filepath, tôi có cần phải kiểm tra xem nó có tồn tại trước khi làm bất cứ điều gì với nó không? – zardon

+0

Tuyệt đối, bởi vì cơ hội hoạt động tốt ở bất kỳ nơi nào khác ngoài máy tính của bạn rất mỏng.Ví dụ: nếu người dùng đặt ứng dụng vào thư mục/Users/username/Applications của họ, thì thay đổi trong tên người dùng sẽ hiển thị đường dẫn được lưu trữ vô ích. –

Các vấn đề liên quan