2012-05-02 39 views
10

Ứng dụng của tôi giống như nhiều ứng dụng - có màn hình đăng nhập nơi người dùng nhập tên người dùng và mật khẩu và nút đăng nhập Ứng dụng của tôi cũng sử dụng Dữ liệu cốt lõi để tiết kiệm phần lớn các đối tượng kinh doanh của người dùng, tất nhiên là người dùng cụ thể.Cách xử lý cơ sở dữ liệu nhiều người dùng

Tôi cũng có nút đăng xuất để bật chuyển đổi người dùng. Điều này không xảy ra nhiều, nhưng vẫn cần thiết).

Bây giờ nếu người dùng khác đăng nhập, tôi cần tìm nạp dữ liệu cụ thể của anh ấy. Nhưng làm sao tôi làm được?
Tôi không muốn xóa cơ sở dữ liệu của người dùng khi anh ấy đăng xuất, tôi muốn lưu nó ngay cả khi người dùng khác đăng nhập từ thiết bị.

Điều duy nhất tôi có thể nghĩ đến là thêm thuộc tính "ownerId" vào mỗi Thực thể tôi lưu qua Dữ liệu cốt lõi và sử dụng thuộc tính này làm vị từ khi tôi tìm nạp đối tượng.
Nhưng điều đó dường như quá lộn xộn.

Trả lời

21

iOS thực sự không có khái niệm về nhiều người dùng nên "đăng nhập" sẽ bị giới hạn trong phạm vi ứng dụng của bạn. Giải pháp đơn giản nhất là sử dụng tên tệp khác cho cửa hàng liên tục cho mỗi người dùng. Điều này chỉ có nguồn gốc ở một nơi (bất cứ nơi nào bạn thiết lập ngăn xếp dữ liệu cốt lõi của bạn) vì vậy nó sẽ được khá đơn giản để thực hiện.

Trong mẫu dữ liệu cốt lõi tiêu chuẩn, vị trí lưu trữ liên tục được đặt bên trong phương thức persistentStoreCoordinator của đại biểu ứng dụng. Đây là dòng này:

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"coreDataTemplate.sqlite"]; 

này về cơ bản có nghĩa là dữ liệu sẽ được lưu trữ trong một tập tin cơ sở dữ liệu SQLite trong thư mục tài liệu, và các tập tin sẽ được gọi coreDataTemplate.sqlite.

Giả sử trước khi mã này được thực hiện, bạn đã đăng nhập người dùng và kiểm tra ID người dùng của họ dựa vào một số danh sách và tìm ra số nhận dạng duy nhất cho họ. Hơn nữa giả định định danh đã được lưu trữ trong mặc định của người dùng.

Thay đổi dòng trên để:

NSString *userIdentifier = [[NSUserDefaults standardUserDefaults] stringForKey:@"loggedOnUserID"];  
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@_coreDataTemplate.sqlite",userIdentifier]]; 

này bây giờ sẽ cung cấp cho bạn một tên tập tin duy nhất cho người dùng của bạn.

Nếu bạn thay đổi người dùng, bạn sẽ cần phải lưu bối cảnh đối tượng được quản lý hiện tại, sau đó đặt điều phối viên lưu trữ liên tục và bối cảnh đối tượng được quản lý của ứng dụng ủy nhiệm trở lại không. Khi họ được tái nhập, nó sẽ được theo ID người dùng mới.

+0

Tôi sử dụng mẫu dữ liệu lõi xCode vì vậy tôi không thực sự biết ở đâu và cách sử dụng một tên tệp khác, nhưng nó giống như một giải pháp rất tốt. Bạn có thể hướng dẫn tôi cách "đặt lại" lưu trữ liên tục và tải theo tên tệp khác không? – Eyal

+0

Sẽ thực hiện, nhưng sẽ không mất vài giờ. – jrturton

+0

Cảm ơn rất nhiều, tôi sẽ đợi :) – Eyal

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