Ứng dụng của tôi yêu cầu dữ liệu từ cơ sở dữ liệu sqlite. Nó sẽ xuất xưởng với một phiên bản của cơ sở dữ liệu này, nhưng tôi cần phải cập nhật nó một cách thường xuyên (rất có thể mỗi tháng một lần). Thông thường tôi đã gửi các bản cập nhật cho các phần khác của ứng dụng dưới dạng XML thông qua một loạt các dịch vụ web mà tôi đã thiết lập, nhưng cơ sở dữ liệu cụ thể mà tôi đang làm bây giờ khá lớn (khoảng 20-30 MB) và tôi ' m nhận được lỗi thời gian chờ khi tôi cố gắng gửi nó theo cách đó.Cập nhật cơ sở dữ liệu sqlite mà không cần XML
Tôi đã thử đặt cơ sở dữ liệu trên máy chủ công ty của mình rồi tải xuống đối tượng NSData
. Sau đó tôi đã lưu đối tượng dữ liệu đó vào thư mục Tài liệu của ứng dụng của tôi. Khi tôi khởi động lại ứng dụng của mình, tôi nhận được thông báo lỗi "Tệp ở đường dẫn dường như không phải là cơ sở dữ liệu SQLite". Mã cho điều này là dưới đây.
// Download data
NSURL *url = [NSURL URLWithString:@"http://www.mysite.net/download/myDatabase.sqlite"];
NSData *fileData = [[NSData alloc] initWithContentsOfURL:url];
NSLog(@"%@",fileData); // Writes a bunch of 8 character (hex?) strings
// Delete old database
NSError *error;
NSURL *destination = [app applicationDocumentsDirectory];
destination = [destination URLByAppendingPathComponent:@"myDatabase"];
destination = [destination URLByAppendingPathExtension:@"sqlite"];
NSLog(@"destination = %@",destination);
[[NSFileManager defaultManager] removeItemAtPath:[destination path] error:&error];
// Save into correct location
[fileData writeToURL:destination atomically:YES];
//[NSFileManager defaultManager] createFileAtPath:[destination path] contents:fileData attributes:nil]; // I also tried this, it doesn't work either.
Có quy trình chuẩn để cập nhật cơ sở dữ liệu lớn mà ứng dụng sẽ sử dụng không? Tôi có cảm giác rằng những gì tôi đang cố gắng làm là không chính xác và rằng có một cách hoàn toàn khác để làm điều này, nhưng tôi không thể hiểu được điều gì.
CẬP NHẬT: Tôi đã thử một vài cách để cố gắng tìm ra vấn đề, nhưng không có gì khiến tôi gần gũi hơn. Tôi đặt cơ sở dữ liệu Tôi đang cố tải xuống từ máy chủ của mình vào một ổ USB và sau đó vào mac tôi đang phát triển và vào thư mục Documents cho ứng dụng của tôi trong Trình mô phỏng. Khi tôi chạy ứng dụng của tôi bằng cách chuyển cơ sở dữ liệu theo cách này, nó chạy mà không có bất kỳ vấn đề gì và tôi có thể xem tất cả dữ liệu của mình.
Ngược lại, tôi đã xóa hoàn toàn ứng dụng của mình khỏi trình mô phỏng và chạy lại ứng dụng, vì vậy nó sẽ tạo cơ sở dữ liệu của tôi từ đầu. Tôi đã chuyển cơ sở dữ liệu mới được tạo từ máy mac của tôi lên máy chủ của tôi bằng ổ USB. Khi tệp đã ở trên máy chủ của tôi, tôi đã cố gắng chạy "bản cập nhật tải xuống" trong khối mã ở trên, nhưng nó vẫn bị lỗi trong lần tiếp theo tôi khởi động ứng dụng của mình với lỗi "Tệp ở đường dẫn không phải là cơ sở dữ liệu SQLite" thông điệp.
Từ các thử nghiệm này, tôi tự tin rằng vấn đề không phải với cơ sở dữ liệu mà tôi đang cố tải xuống. Cái gì đó trong mã "cập nhật tải xuống" của tôi đang làm hỏng cơ sở dữ liệu, nhưng tôi vẫn chưa thể tìm ra lý do, cũng như tôi không tìm thấy phương thức thay thế có thể chấp nhận để cập nhật cho người dùng của mình khi ứng dụng của tôi khởi chạy.
UPDATE 2: Tôi đã làm một số tìm kiếm nhiều hơn, và tôi đã học được rằng người dùng sẽ cần phải đặt trong một tên người dùng và mật khẩu để truy cập vào bất kỳ tập tin trên máy chủ của tôi. Bây giờ tôi tin rằng NSData
Tôi nhận được từ mã của tôi ở trên thực sự là một thách thức xác thực, hoặc một cái gì đó liên quan đến điều đó, và đó là lý do tại sao khi tôi lưu nó với NSFileManager
nó không được công nhận là một sqlite DB.
Giải pháp đơn giản nhất mà tôi đã nhận được thông qua xác thực là here. Khi tôi cố gắng thực hiện NSData *fileData = [NSData dataWithContentsOfURL:url options:NSDataReadingMapped error:&error];
(sau khi thay đổi số url
như được đề xuất trong liên kết, tất nhiên), tôi gặp lỗi NSCocoaErrorDomain Code=256
, đây chỉ là lỗi không xác định. My fileData
là nil
sau khi thực hiện việc này. Tôi đã nhận thấy bài đăng này khá cũ nên tôi không biết liệu bài đăng đó có được hỗ trợ hay không.
Tôi cũng tìm thấy giải pháp khác cho vấn đề xác thực here bằng cách sử dụng NSURLConnection
thay vì dataWithContentsOfURL
. Điều này là gần đây hơn nhiều, nhưng có một số cú pháp tìm kiếm nâng cao hơn được sử dụng trong ví dụ mà tôi chưa từng thấy trước đây. Tôi đã có thể sao chép khá nhiều từ ví dụ, và dự án của tôi sẽ xây dựng mà không có lỗi, nhưng tôi không biết cú pháp thích hợp để sử dụng quy trình fetchURL:withCompletion:failure:
từ UIViewController
của tôi.Tôi đã thử
NSError *error;
NSData *fileData;
ExampleDelegate *download = [[ExampleDelegate alloc] init];
[download fetchURL:url withCompletion:fileData failure:&error];
nhưng điều đó tạo ra lỗi xây dựng khi gửi con trỏ không tương thích. Tôi nghĩ rằng tôi không thể chuyển thẳng một đối tượng NSData
và NSError
như ExampleDelegateSuccess
và ExampleDelegateFailure
tương ứng, mặc dù chúng là những gì được typedef
chỉnh sửa. Tôi có thể phải làm một cái gì đó để fileData
và error
để chuyển đổi chúng, nhưng typedef
ing là một trong những "cú pháp tìm kiếm nâng cao" tôi đã đề cập ở trên, và tôi không thực sự biết phải làm gì.
Nó không được bao gồm trong ví dụ của anh ấy, nhưng tôi đã tìm thấy một phương pháp NSURLConnectionDelegate
gọi là connection:didReceiveAuthenticationChallenge:
here mà tôi nghĩ mình có thể thêm vào mã từ ví dụ và điều đó sẽ giải quyết vấn đề xác thực của tôi. Tôi cảm thấy nếu tôi chỉ biết cách gọi số fetchURL
tôi sẽ được thiết lập. Có ai có lời khuyên nào về những gì tôi cần làm để nhận được fileData
và error
vào cuộc gọi đó không?
Cảm ơn đề xuất. Tôi đã nhìn thấy rất nhiều về JSON ở đây, nhưng chưa sử dụng nó - Tôi sẽ xem xét nó (và AFHTTPClient bạn đã đề cập). Tôi xem xét việc phá vỡ cơ sở dữ liệu của mình thành nhiều tệp, nhưng nó được đảm bảo khá nhiều để tiếp tục phát triển, vì vậy chỉ cần bao nhiêu phần tôi nên cắt nó thành một chút khó khăn để tìm ra. Tôi đã hy vọng tìm được một con đường khác để đi, nhưng đây có thể là cách duy nhất. – GeneralMike
Tôi hy vọng nó sẽ tốt cho bạn. – HalR
+1: gợi ý tốt - chia nhỏ thành nhiều phần có thể giúp ... –