2013-10-05 14 views
20

Tôi đang tạo trò chơi và khi tôi đóng ứng dụng (đóng ở trình quản lý đa nhiệm), tất cả dữ liệu của tôi đã biến mất! Vì vậy, Câu hỏi của tôi rất đơn giản: Làm cách nào để lưu dữ liệu?Cách lưu dữ liệu trong iOS

+8

gì loại dữ liệu bạn đang cố gắng tiết kiệm và bao nhiêu? –

Trả lời

25

Giả sử bạn muốn lưu điểm và cấp, cả hai thuộc tính của một đối tượng được gọi là dataHolder.

DataHolder có thể được tạo ra như là một singleton, vì vậy bạn không cần phải lo lắng quá nhiều về từ nơi bạn truy cập vào nó (nó sharedInstance thực tế):

Nó là mã sẽ trông một chút như thế này:

DataHolder.h

#import <Foundation/Foundation.h> 

@interface DataHolder : NSObject 

+ (DataHolder *)sharedInstance; 

@property (assign) int level; 
@property (assign) int score; 

-(void) saveData; 
-(void) loadData; 

@end 

DataHolder.m

NSString * const kLevel = @"kLevel"; 
NSString * const kScore = @"kScore"; 

@implementation DataHolder 

- (id) init 
{ 
    self = [super init]; 
    if (self) 
    { 
     _level = 0; 
     _score = 0; 
    } 
    return self; 
} 

+ (DataHolder *)sharedInstance 
{ 
    static MDataHolder *_sharedInstance = nil; 
    static dispatch_once_t onceSecurePredicate; 
    dispatch_once(&onceSecurePredicate,^ 
        { 
         _sharedInstance = [[self alloc] init]; 
        }); 

    return _sharedInstance; 
} 

//in this example you are saving data to NSUserDefault's 
//you could save it also to a file or to some more complex 
//data structure: depends on what you need, really 

-(void)saveData 
{ 
    [[NSUserDefaults standardUserDefaults] 
     setObject:[NSNumber numberWithInt:self.score] forKey:kScore]; 

    [[NSUserDefaults standardUserDefaults] 
     setObject:[NSNumber numberWithInt:self.level] forKey:kLevel]; 

    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

-(void)loadData 
{ 
    if ([[NSUserDefaults standardUserDefaults] objectForKey:kScore]) 
    { 
     self.score = [(NSNumber *)[[NSUserDefaults standardUserDefaults] 
      objectForKey:kScore] intValue]; 

     self.level = [(NSNumber *)[[NSUserDefaults standardUserDefaults] 
      objectForKey:kLevel] intValue]; 
    } 
    else 
    { 
     self.level = 0; 
     self.score = 0; 
    } 
} 

@end 

Đừng quên # import "DataHolder.h" ở nơi bạn cần hoặc chỉ cần đặt trong ...-Prefix.pch.

Bạn có thể thực hiện tải thực tế và tiết kiệm trong appDelegate phương pháp:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    [[DataHolder sharedInstance] saveData]; 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    [[DataHolder sharedInstance] loadData]; 
} 

Bạn có thể truy cập dữ liệu điểm và trình độ của bạn từ bất cứ nơi nào với [DataHolder sharedInstance].score[DataHolder sharedInstance].level. Điều này có vẻ như quá mức cho một nhiệm vụ đơn giản nhưng nó chắc chắn giúp giữ cho mọi thứ gọn gàng và nó có thể giúp bạn tránh việc lưu giữ tất cả các dữ liệu trong appDelegate (thường là nhanh chóng & đường dẫn bẩn đến giải pháp).

9

Bạn có thể lưu dữ liệu trong CoreData, SqlLite hoặc NSUserDefaults Cập nhật Realm cũng là một lựa chọn và rất dễ thực hiện.

+9

Hoặc một tệp phẳng đơn giản, có lẽ chứa dữ liệu trong biểu diễn JSON hoặc định dạng CSV. –

+0

cái nào an toàn? –

+1

Nếu bạn có một số điều nhạy cảm thì đừng lưu trữ nó trong NSUserDefaults. Hãy thử lưu vào những người khác, như Realm sql hoặc dữ liệu cốt lõi và sử dụng mã hóa. nếu bạn có vài thứ như tên người dùng và mật khẩu –

10

[NSUserDefaults standardUserDefaults] phù hợp cho một lượng nhỏ dữ liệu như cài đặt và tùy chọn của người dùng. Thông thường, bạn sử dụng tính năng này để cho phép người dùng lưu các bit dữ liệu khác nhau xác định các giá trị toàn cầu như tùy chọn ký tự, tùy chọn vũ khí, v.v.

Để có số lượng lớn hơn như chi tiết cấp trò chơi hoặc thành tích hoặc vũ khí, v.v. Bạn sẽ muốn sử dụng một cái gì đó như Core Data. Đây là cơ sở dữ liệu chính thức hơn có thể dễ dàng di chuyển khi thay đổi lược đồ dữ liệu của bạn. Xem tài liệu tại đây: Core DataCore Data Programming Guide

0

Tôi khuyên bạn nên sử dụng Realm để có các giải pháp tổng quát hơn.

0

Swift 3

Sử dụng UserDefaults

UserDefaults.standard.set(„some value”, „key”) 
let value = UserDefaults.standard.string(„key”) 

Bạn thậm chí có thể kéo dài mảng sử dụng này

1

Có vài cách để lưu dữ liệu trong ios.

  1. UserDefaults - cách tuyệt vời để tiết kiệm một lượng nhỏ dữ liệu.
  2. Keychain - vị trí an toàn cho dữ liệu có độ nhạy cao an toàn như dữ liệu đăng nhập và mật khẩu.
  3. Cơ sở dữ liệu SQLite - Nếu ứng dụng của bạn có một số lượng lớn các dữ liệu có cấu trúc
  4. CoreData - dựa trên một đồ thị đối tượng mô tả các đối tượng cần được lưu
  5. Saving Files - Tất nhiên bạn cũng có thể trực tiếp lưu tất cả các loại tệp vào hệ thống tệp. Tuy nhiên, bạn chỉ có thể truy cập vào hệ thống tệp trong vùng chứa ứng dụng vì lý do bảo mật.
  6. Sử dụng cơ sở dữ liệu Realm - thay thế tốt nhất cho Dữ liệu cốt lõi và SQLite db
  7. NSKeyedArchiver và NSKeyedUnarchiver - cách tốt hơn cho số lượng nhỏ các đối tượng. // i nghĩ như vậy

ref - http://www.thomashanning.com/data-persistence-ios/

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