源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

以代码实例总结iOS应用开发中数据的存储方式

  • 时间:2022-11-03 19:19 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:以代码实例总结iOS应用开发中数据的存储方式
ios数据存储包括以下几种存储机制: [list] [*]属性列表[/*] [*]对象归档[/*] [*]SQLite3[/*] [*]CoreData[/*] [*]AppSettings[/*] [*]普通文件存储[/*] [/list] [b]1、属性列表 [/b]
[u]复制代码[/u] 代码如下:
//  //  Persistence1ViewController.h  //  Persistence1  //  //  Created by liu lavy on 11-10-3.  //  Copyright 2011 __MyCompanyName__. All rights reserved.  //    #import <UIKit/UIKit.h>  #define kFilename @"data.plist"    @interface Persistence1ViewController : UIViewController {      UITextField *filed1;      UITextField *field2;      UITextField *field3;      UITextField *field4;  }  @property (nonatomic, retain) IBOutlet UITextField *field1;  @property (nonatomic, retain) IBOutlet UITextField *field2;  @property (nonatomic, retain) IBOutlet UITextField *field3;  @property (nonatomic, retain) IBOutlet UITextField *field4;    - (NSString *)dataFilePath;  - (void)applicationWillResignActive:(NSNotification *)notification;    @end 
[u]复制代码[/u] 代码如下:
//  //  Persistence1ViewController.m  //  Persistence1  //  //  Created by liu lavy on 11-10-3.  //  Copyright 2011 __MyCompanyName__. All rights reserved.  //    #import "Persistence1ViewController.h"    @implementation Persistence1ViewController  @synthesize field1;  @synthesize field2;  @synthesize field3;  @synthesize field4;    //数据文件的完整路径  - (NSString *)dataFilePath {      //检索Documents目录路径。第二个参数表示将搜索限制在我们的应用程序沙盒中      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);      //每个应用程序只有一个Documents目录      NSString *documentsDirectory = [paths objectAtIndex:0];      //创建文件名      return [documentsDirectory stringByAppendingPathComponent:kFilename];  }    //应用程序退出时,将数据保存到属性列表文件  - (void)applicationWillResignActive:(NSNotification *)notification {      NSMutableArray *array = [[NSMutableArray alloc] init];      [array addObject: field1.text];      [array addObject: field2.text];      [array addObject: field3.text];      [array addObject: field4.text];      [array writeToFile:[self dataFilePath] atomically:YES];      [array release];  }    /* // The designated initializer. Override to perform setup that is required before the view is loaded. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];     if (self) {         // Custom initialization     }     return self; } */    /* // Implement loadView to create a view hierarchy programmatically, without using a nib. - (void)loadView { } */        // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.  - (void)viewDidLoad {      [super viewDidLoad];      NSString *filePath = [self dataFilePath];      //检查数据文件是否存在      if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {          NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];          field1.text = [array objectAtIndex:0];          field2.text = [array objectAtIndex:1];          field3.text = [array objectAtIndex:2];          field4.text = [array objectAtIndex:3];          [array release];      }      UIApplication *app = [UIApplication sharedApplication];      [[NSNotificationCenter defaultCenter] addObserver:self                                              selector:@selector(applicationWillResignActive:)                                              name:UIApplicationWillResignActiveNotification                                              object:app];      [super viewDidLoad];  }      /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {     // Return YES for supported orientations     return (interfaceOrientation == UIInterfaceOrientationPortrait); } */    - (void)didReceiveMemoryWarning {      // Releases the view if it doesn't have a superview.      [super didReceiveMemoryWarning];            // Release any cached data, images, etc that aren't in use.  }    - (void)viewDidUnload {      self.field1 = nil;      self.field2 = nil;      self.field3 = nil;      self.field4 = nil;      [super viewDidUnload];  }      - (void)dealloc {      [field1 release];      [field2 release];      [field3 release];      [field4 release];      [super dealloc];  }    @end 
[b]2、对象归档 [/b]
[u]复制代码[/u] 代码如下:
//  //  Fourlines.h  //  Persistence2  //  //  Created by liu lavy on 11-10-3.  //  Copyright 2011 __MyCompanyName__. All rights reserved.  //    #import <Foundation/Foundation.h>    @interface Fourlines : NSObject <NSCoding, NSCopying> {      NSString *field1;      NSString *field2;      NSString *field3;      NSString *field4;  }  @property (nonatomic, retain) NSString *field1;  @property (nonatomic, retain) NSString *field2;  @property (nonatomic, retain) NSString *field3;  @property (nonatomic, retain) NSString *field4;    @end 
[u]复制代码[/u] 代码如下:
//  //  Fourlines.m  //  Persistence2  //  //  Created by liu lavy on 11-10-3.  //  Copyright 2011 __MyCompanyName__. All rights reserved.  //    #import "Fourlines.h"    #define kField1Key @"Field1"  #define kField2Key @"Field2"  #define kField3Key @"Field3"  #define kField4Key @"Field4"    @implementation Fourlines  @synthesize field1;  @synthesize field2;  @synthesize field3;  @synthesize field4;    #pragma mark NSCoding  - (void)encodeWithCoder:(NSCoder *)aCoder {      [aCoder encodeObject:field1 forKey:kField1Key];      [aCoder encodeObject:field2 forKey:kField2Key];      [aCoder encodeObject:field3 forKey:kField3Key];      [aCoder encodeObject:field4 forKey:kField4Key];  }    -(id) initWithCoder:(NSCoder *)aDecoder {      if(self = [super init]) {          field1 = [[aDecoder decodeObjectForKey:kField1Key] retain];          field2 = [[aDecoder decodeObjectForKey:kField2Key] retain];          field3 = [[aDecoder decodeObjectForKey:kField3Key] retain];          field4 = [[aDecoder decodeObjectForKey:kField4Key] retain];      }      return self;  }    #pragma mark -  #pragma mark NSCopying  - (id) copyWithZone:(NSZone *)zone {      Fourlines *copy = [[[self class] allocWithZone: zone] init];      copy.field1 = [[self.field1 copyWithZone: zone] autorelease];      copy.field2 = [[self.field2 copyWithZone: zone] autorelease];      copy.field3 = [[self.field3 copyWithZone: zone] autorelease];      copy.field4 = [[self.field4 copyWithZone: zone] autorelease];      return copy;  }  @end 
[u]复制代码[/u] 代码如下:
//  //  Persistence2ViewController.h  //  Persistence2  //  //  Created by liu lavy on 11-10-3.  //  Copyright 2011 __MyCompanyName__. All rights reserved.  //    #import <UIKit/UIKit.h>  #define kFilename @"archive"  #define kDataKey @"Data"    @interface Persistence2ViewController : UIViewController {      UITextField *filed1;      UITextField *field2;      UITextField *field3;      UITextField *field4;  }  @property (nonatomic, retain) IBOutlet UITextField *field1;  @property (nonatomic, retain) IBOutlet UITextField *field2;  @property (nonatomic, retain) IBOutlet UITextField *field3;  @property (nonatomic, retain) IBOutlet UITextField *field4;    - (NSString *)dataFilePath;  - (void)applicationWillResignActive:(NSNotification *)notification;    @end 
[u]复制代码[/u] 代码如下:
//  //  Persistence2ViewController.m  //  Persistence2  //  //  Created by liu lavy on 11-10-3.  //  Copyright 2011 __MyCompanyName__. All rights reserved.  //    #import "Persistence2ViewController.h"  #import "Fourlines.h"    @implementation Persistence2ViewController  @synthesize field1;  @synthesize field2;  @synthesize field3;  @synthesize field4;    //数据文件的完整路径  - (NSString *)dataFilePath {      //检索Documents目录路径。第二个参数表示将搜索限制在我们的应用程序沙盒中      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);      //每个应用程序只有一个Documents目录      NSString *documentsDirectory = [paths objectAtIndex:0];      //创建文件名      return [documentsDirectory stringByAppendingPathComponent:kFilename];  }    //应用程序退出时,将数据保存到属性列表文件  - (void)applicationWillResignActive:(NSNotification *)notification {      Fourlines *fourlines = [[Fourlines alloc] init];      fourlines.field1 = field1.text;      fourlines.field2 = field2.text;      fourlines.field3 = field3.text;      fourlines.field4 = field4.text;            NSMutableData *data = [[NSMutableData alloc] init];//用于存储编码的数据      NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];            [archiver encodeObject:fourlines forKey:kDataKey];      [archiver finishEncoding];      [data writeToFile:[self dataFilePath] atomically:YES];            [fourlines release];      [archiver release];      [data release];  }    /*  // The designated initializer. Override to perform setup that is required before the view is loaded.  - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  if (self) {  // Custom initialization  }  return self;  }  */    /*  // Implement loadView to create a view hierarchy programmatically, without using a nib.  - (void)loadView {  }  */        // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.  - (void)viewDidLoad {      [super viewDidLoad];      NSString *filePath = [self dataFilePath];      //检查数据文件是否存在      if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {                    //从文件获取用于解码的数据          NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];          NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];                    Fourlines *fourlines = [unarchiver decodeObjectForKey:kDataKey];          [unarchiver finishDecoding];                    field1.text = fourlines.field1;          field2.text = fourlines.field2;          field3.text = fourlines.field3;          field4.text = fourlines.field4;                    [unarchiver release];          [data release];      }      UIApplication *app = [UIApplication sharedApplication];      [[NSNotificationCenter defaultCenter] addObserver:self                                               selector:@selector(applicationWillResignActive:)                                               name:UIApplicationWillResignActiveNotification                                               object:app];      [super viewDidLoad];  }      /*  // Override to allow orientations other than the default portrait orientation.  - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {  // Return YES for supported orientations  return (interfaceOrientation == UIInterfaceOrientationPortrait);  }  */    - (void)didReceiveMemoryWarning {      // Releases the view if it doesn't have a superview.      [super didReceiveMemoryWarning];            // Release any cached data, images, etc that aren't in use.  }    - (void)viewDidUnload {      self.field1 = nil;      self.field2 = nil;      self.field3 = nil;      self.field4 = nil;      [super viewDidUnload];  }      - (void)dealloc {      [field1 release];      [field2 release];      [field3 release];      [field4 release];      [super dealloc];  }  @end 
[b]3、SQLite [/b]
[u]复制代码[/u] 代码如下:
//  //  Persistence3ViewController.h  //  Persistence3  //  //  Created by liu lavy on 11-10-3.  //  Copyright 2011 __MyCompanyName__. All rights reserved.  //    #import <UIKit/UIKit.h>  #define kFilename @"data.sqlite3"    @interface Persistence3ViewController : UIViewController {      UITextField *filed1;      UITextField *field2;      UITextField *field3;      UITextField *field4;  }  @property (nonatomic, retain) IBOutlet UITextField *field1;  @property (nonatomic, retain) IBOutlet UITextField *field2;  @property (nonatomic, retain) IBOutlet UITextField *field3;  @property (nonatomic, retain) IBOutlet UITextField *field4;    - (NSString *)dataFilePath;  - (void)applicationWillResignActive:(NSNotification *)notification;  @end 
[u]复制代码[/u] 代码如下:
//  //  Persistence3ViewController.m  //  Persistence3  //  //  Created by liu lavy on 11-10-3.  //  Copyright 2011 __MyCompanyName__. All rights reserved.  //    #import "Persistence3ViewController.h"  #import <sqlite3.h>    @implementation Persistence3ViewController  @synthesize field1;  @synthesize field2;  @synthesize field3;  @synthesize field4;    //数据文件的完整路径  - (NSString *)dataFilePath {      //检索Documents目录路径。第二个参数表示将搜索限制在我们的应用程序沙盒中      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);      //每个应用程序只有一个Documents目录      NSString *documentsDirectory = [paths objectAtIndex:0];      //创建文件名      return [documentsDirectory stringByAppendingPathComponent:kFilename];  }    //应用程序退出时,将数据保存到属性列表文件  - (void)applicationWillResignActive:(NSNotification *)notification {      sqlite3 *database;      if(sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK) {          sqlite3_close(database);          NSAssert(0, @"Failed to open database");      }            for(int i = 1; i <= 4; i++) {          NSString *fieldname = [[NSString alloc] initWithFormat:@"field%d", i];          UITextField *field = [self valueForKey:fieldname];          [fieldname release];                    char *update = "INSERT OR REPLACE INTO FIELDS (ROW, FIELD_DATA) VALUES (?, ?);";          sqlite3_stmt *stmt;          //将SQL语句编译为sqlite内部一个结构体(sqlite3_stmt),类似java JDBC的PreparedStatement预编译          if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) {              //在bind参数的时候,参数列表的index从1开始,而取出数据的时候,列的index是从0开始              sqlite3_bind_int(stmt, 1, i);              sqlite3_bind_text(stmt, 2, [field.text UTF8String], -1, NULL);          } else {              NSAssert(0, @"Error:Failed to prepare statemen");          }          //执行SQL文,获取结果           int result = sqlite3_step(stmt);          if(result != SQLITE_DONE) {              NSAssert1(0, @"Error updating table: %d", result);          }          //释放stmt占用的内存(sqlite3_prepare_v2()分配的)          sqlite3_finalize(stmt);      }      sqlite3_close(database);  }    /*  // The designated initializer. Override to perform setup that is required before the view is loaded.  - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];  if (self) {  // Custom initialization  }  return self;  }  */    /*  // Implement loadView to create a view hierarchy programmatically, without using a nib.  - (void)loadView {  }  */        // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.  - (void)viewDidLoad {      [super viewDidLoad];      NSString *filePath = [self dataFilePath];      //检查数据文件是否存在      if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {          //打开数据库          sqlite3 *database;          if(sqlite3_open([filePath UTF8String], &database) != SQLITE_OK) {              sqlite3_close(database);              NSAssert(0, @"Failed to open database");          }                    //创建表          char *errorMsg;          NSString *createSQL =               @"CREATE TABLE IF NOT EXISTS FIELDS (ROW INTEGER PRIMARY KEY, FIELD_DATA TEXT);";          if(sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {              sqlite3_close(database);              NSAssert(0, @"Error creating table: %s", errorMsg);          }            //查询          NSString *query = @"SELECT ROW, FIELD_DATA FROM FIELDS ORDER BY ROW";          sqlite3_stmt *statement;          //设置nByte可以加速操作          if(sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {              while (sqlite3_step(statement) == SQLITE_ROW) {//返回每一行                  int row = sqlite3_column_int(statement, 0);                  char *rowData = (char *)sqlite3_column_text(statement, 1);                                    NSString *fieldName = [[NSString alloc] initWithFormat:@"field%d", row];                  NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData];                                    UITextField *field = [self valueForKey:fieldName];                  field.text = fieldValue;                                    [fieldName release];                  [fieldValue release];              }              //释放statement占用的内存(sqlite3_prepare()分配的)              sqlite3_finalize(statement);          }          sqlite3_close(database);      }                  UIApplication *app = [UIApplication sharedApplication];      [[NSNotificationCenter defaultCenter] addObserver:self                                               selector:@selector(applicationWillResignActive:)                                                   name:UIApplicationWillResignActiveNotification                                                 object:app];      [super viewDidLoad];  }      /*  // Override to allow orientations other than the default portrait orientation.  - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {  // Return YES for supported orientations  return (interfaceOrientation == UIInterfaceOrientationPortrait);  }  */    - (void)didReceiveMemoryWarning {      // Releases the view if it doesn't have a superview.      [super didReceiveMemoryWarning];            // Release any cached data, images, etc that aren't in use.  }    - (void)viewDidUnload {      self.field1 = nil;      self.field2 = nil;      self.field3 = nil;      self.field4 = nil;      [super viewDidUnload];  }      - (void)dealloc {      [field1 release];      [field2 release];      [field3 release];      [field4 release];      [super dealloc];  }    @end 
[b]4、Core Data [/b]
[u]复制代码[/u] 代码如下:
//  //  PersistenceViewController.h  //  Persistence4  //  //  Created by liu lavy on 11-10-3.  //  Copyright 2011 __MyCompanyName__. All rights reserved.  //    #import <UIKit/UIKit.h>      @interface PersistenceViewController : UIViewController {      UITextField *filed1;      UITextField *field2;      UITextField *field3;      UITextField *field4;  }  @property (nonatomic, retain) IBOutlet UITextField *field1;  @property (nonatomic, retain) IBOutlet UITextField *field2;  @property (nonatomic, retain) IBOutlet UITextField *field3;  @property (nonatomic, retain) IBOutlet UITextField *field4;    @end 
[u]复制代码[/u] 代码如下:
//  //  PersistenceViewController.m  //  Persistence4  //  //  Created by liu lavy on 11-10-3.  //  Copyright 2011 __MyCompanyName__. All rights reserved.  //    #import "PersistenceViewController.h"  #import "Persistence4AppDelegate.h"    @implementation PersistenceViewController  @synthesize field1;  @synthesize field2;  @synthesize field3;  @synthesize field4;      -(void) applicationWillResignActive:(NSNotification *)notification {      Persistence4AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];      NSManagedObjectContext *context = [appDelegate managedObjectContext];      NSError *error;      for(int i = 1; i <= 4; i++) {          NSString *fieldName = [NSString stringWithFormat:@"field%d", i];          UITextField *theField = [self valueForKey:fieldName];                    //创建提取请求          NSFetchRequest *request = [[NSFetchRequest alloc] init];          //创建实体描述并关联到请求          NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line"                                                               inManagedObjectContext:context];          [request setEntity:entityDescription];                    //设置检索数据的条件          NSPredicate *pred = [NSPredicate predicateWithFormat:@"(lineNum = %d)", i];          [request setPredicate:pred];                    NSManagedObject *theLine = nil;          ////检查是否返回了标准匹配的对象,如果有则加载它,如果没有则创建一个新的托管对象来保存此字段的文本          NSArray *objects = [context executeFetchRequest:request error:&error];          if(!objects) {              NSLog(@"There was an error");          }          //if(objects.count > 0) {          //  theLine = [objects objectAtIndex:0];          //} else {              //创建一个新的托管对象来保存此字段的文本              theLine = [NSEntityDescription insertNewObjectForEntityForName:@"Line"                                                      inManagedObjectContext:context];              [theLine setValue:[NSNumber numberWithInt:i] forKey:@"lineNum"];              [theLine setValue:theField.text forKey:@"lineText"];          //}          [request release];      }      //通知上下文保存更改      [context save:&error];        }    // The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.  /* - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];     if (self) {         // Custom initialization.     }     return self; } */      // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.  - (void)viewDidLoad {      Persistence4AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];            NSManagedObjectContext *context = [appDelegate managedObjectContext];      //创建一个实体描述      NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line" inManagedObjectContext:context];      //创建一个请求,用于提取对象      NSFetchRequest *request = [[NSFetchRequest alloc] init];      [request setEntity:entityDescription];            //检索对象      NSError *error;      NSArray *objects = [context executeFetchRequest:request error:&error];      if(!objects) {          NSLog(@"There was an error!");      }      for(NSManagedObject *obj in objects) {          NSNumber *lineNum = [obj valueForKey:@"lineNum"];          NSString *lineText = [obj valueForKey:@"lineText"];          NSString *fieldName = [NSString stringWithFormat:@"field%d", [lineNum integerValue]];          UITextField *textField = [self valueForKey:fieldName];          textField.text = lineText;      }      [request release];            UIApplication *app = [UIApplication sharedApplication];      [[NSNotificationCenter defaultCenter] addObserver:self                                                selector:@selector(applicationWillResignActive:)                                                    name:UIApplicationWillResignActiveNotification                                                 object:app];      [super viewDidLoad];  }    /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {     // Return YES for supported orientations.     return (interfaceOrientation == UIInterfaceOrientationPortrait); } */    - (void)didReceiveMemoryWarning {      // Releases the view if it doesn't have a superview.      [super didReceiveMemoryWarning];            // Release any cached data, images, etc. that aren't in use.  }    - (void)viewDidUnload {      self.field1 = nil;      self.field2 = nil;      self.field3 = nil;      self.field4 = nil;      [super viewDidUnload];  }      - (void)dealloc {      [field1 release];      [field2 release];      [field3 release];      [field4 release];      [super dealloc];  }        @end 
[b]5、AppSettings [/b]
[u]复制代码[/u] 代码如下:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[b]6、普通文件存储[/b] 这种方式即自己将数据通过IO保存到文件,或从文件读取。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部