2011-09-22 39 views
6

Tôi nhận được một NSDictionary từ JSON (sử dụng SBJson), và tôi muốn lưu trữ nó. Tôi đang sử dụngwriteToFile không thành công - làm cách nào để gỡ lỗi WHY không thành công (công cụ nào)?

[liveData writeToFile:localFilePath atomically:YES] 

và không thành công. Dữ liệu trông giống như giống như tất cả NSString, NSDictionary và NSArray của nó (yêu cầu "nguyên tử: CÓ"). Tôi đã sử dụng cùng một localFilePath elesewhere.

Vì vậy, câu hỏi của tôi là: làm thế nào tôi có thể tìm ra vấn đề ở đâu? Tôi có thể sử dụng những công cụ nào để hiểu tại sao writeToFile không thành công? Nhật ký không hiển thị thông báo lỗi.

+0

Bạn đã NSLogged 'localFilePath' để xem giá trị là gì? Bạn có chắc là bạn đã đặt cho nó một tên duy nhất để lưu không? – msgambel

+0

Tôi đồng ý rằng vấn đề có thể là đường dẫn của bạn, bạn có thể đưa mã đó vào không? – Brodie

+1

Tôi đã đăng nhập localFilePath của mình và tôi cũng đã sử dụng nó ở nơi khác trong mã của mình để lưu trữ thứ khác (chỉ thay đổi tên tệp - đó là NSTemporaryDirectory() cộng với tên tệp) vì vậy tôi khá chắc chắn không phải vậy. Nhưng thực sự câu hỏi của tôi là: làm thế nào để gỡ lỗi vấn đề này - làm thế nào tôi có thể tìm hiểu thêm về sự thất bại? Có một mã lỗi hoặc một số công cụ gỡ lỗi trong xcode bên ngoài của logger có thể giúp tôi ghim nó xuống? Hay tôi chỉ cần sử dụng bản dùng thử và lỗi để xác định nó? –

Trả lời

7

Nó có thể có nhiều lý do:

  • Con đường bạn đang viết cho là sai, không ghi được (bạn không có quyền ghi vào nó), hoặc thư mục cha không tồn tại (nếu localFilePath là "/path/to/file.plist" nhưng thư mục "/ path/to /" không tồn tại, nó sẽ thất bại)
  • Từ điển liveData không chứa các đối tượng không phải là đối tượng PropertyList. Chỉ NSData, NSDate, NSNumber, NSString, NSArray, hoặc NSDictionary đối tượng có thể được viết vào một tập tin Danh sách tài sản (và writeToFile:atomically:làm ghi vào một file plist rất điển làm phải chỉ chứa đối tượng plist cho phương pháp để thành công)
+1

Cũng đáng chú ý, nếu bạn có một giá trị 'NULL' trong từ điển' writeToFile' của bạn sẽ thất bại. – inorganik

+0

Bất kỳ giá trị nào của lớp NSNull trong từ điển sẽ không thành công. Vì vậy, hãy kiểm tra rõ ràng tất cả các giá trị trước khi đưa vào từ điển. Trong trường hợp của tôi, tôi đã đọc các giá trị từ JSON (dữ liệu máy chủ) là một nguồn tốt của các giá trị như vậy. – zinnuree

1

Tôi đã thử lưu NSDictionary vào đĩa chỉ với số cho khóa và giá trị. Chuyển đổi khóa thành công việc NSString nhưng không phải khi các khóa này là NSNumber. Các phím có phải là NSString không?

EDIT: Tôi biết rõ hơn bây giờ rằng nó có thể là bất kỳ đối tượng nào phản hồi hàm băm; thường nó là NSString, mặc dù.

+1

Có. Xem câu trả lời của tôi ở trên. – badweasel

+0

Sigh ... đã phải chuyển đổi từ NSNumber sang NSString để lưu dữ liệu vào tệp. Cảm ơn vì tiền hỗ trợ. –

4

Tôi biết đây là câu hỏi 2 năm tuổi. Nhưng kể từ khi tôi chỉ có cùng một vấn đề và cố định nó ở đây là những gì tôi tìm thấy. Tôi đặt cược NSDictionary của bạn có một số phím không phải là NSStrings.

Thay vì keying như:

[_myDictionay setObject:thisObj forKey:[NSNumber numberWithInt:keyNumber]]; 

chính như:

[_myDictionay setObject:thisObj forKey:[NSString stringWithFormat:@"%i",numberWithInt:keyNumber]]; 

Đó cố định vấn đề của tôi phải lên.

Cách trên cùng không thể lưu vào tệp plist.

Vì bạn đang nhận được thông tin của mình từ một chuyển đổi JSON, có thể có một số đối tượng hoặc khóa là NSNumbers trong đó. Bạn sẽ phải chuyển đổi chúng. Nhưng đó là một nỗi đau.

Vì bạn đã có nó trong json, hãy lưu trữ toàn bộ chuỗi json trong khóa @ "data" và mở rộng lại khi bạn tải plist sau này vào mảng hoặc dict của bạn.

+0

Điều này đã khắc phục được sự cố của tôi (trong trường hợp của tôi, tôi có các khóa là 'NSDate'), tuy nhiên, nó vẫn không trả lời câu hỏi về những công cụ có sẵn để gỡ lỗi. Nó sẽ là tuyệt vời nếu có một cái gì đó tôi có thể chọc vào mã với điều đó sẽ nói một cái gì đó như "* NSDate không phải là một chìa khóa hợp lệ để ghi vào một tập tin plist *" hoặc một số như vậy. – Olie

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