2011-11-07 45 views
23

Tôi đang tạo ứng dụng mà tôi muốn lưu trữ thông tin người dùng cục bộ trên thiết bị mà không cần sử dụng bất kỳ cơ sở dữ liệu máy chủ nào - nhưng mọi thứ ở phía thiết bị. Tôi đang tìm cách lưu trữ các vị trí người dùng cụ thể và hiển thị vị trí đó trong chế độ xem bảng và vì vậy ngay cả khi người dùng khởi chạy ứng dụng sau - Tôi có thể kéo lịch sử và nạp bảng lịch sử với các vị trí trước đây. Về cơ bản một khả năng đọc/ghi từ một cơ sở dữ liệu cục bộ.lưu trữ dữ liệu cục bộ trên iphone

Bây giờ, tôi biết rằng có nhiều câu hỏi như vậy trước đây nhưng tôi không thể tìm thấy địa chỉ lưu dữ liệu cục bộ mà không có cơ sở dữ liệu bên ngoài. Tôi không chắc chắn, ví dụ, sử dụng dữ liệu lõi là điều chính xác và đơn giản nhất để làm ở đây.

Sẽ đánh giá cao mọi lời khuyên về điều đó.

+0

Kiểm tra câu hỏi này/câu trả lời: http: // stackoverflow .c om/questions/307313/best-way-to-save-data-on-the-iphone – Ralfonso

+0

Nếu vấn đề được giải quyết, bạn nên kiểm tra câu hỏi của mình đã được giải quyết và chọn câu trả lời để giúp mọi người trong tương lai với cùng một vấn đề –

+0

hey @TommyG lưu trữ hồ sơ giao dịch, trong trường hợp thông tin vị trí của bạn tốt hơn để sử dụng cơ sở dữ liệu bên ngoài như SqLite hoặc CoreDate hơn là sử dụng NSUserDefaults [https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/ NSUserDefaults_Class /]. Vì vậy, để làm cho cuộc sống của bạn dễ dàng hơn như thế nào về việc thử một thư viện ORM như https://github.com/LakithaRav/OLCOrm để hoàn thành công việc. – Laky

Trả lời

63

Đối với dữ liệu đơn giản, bạn nên sử dụng NSUserDefaults. CoreData là rất mát mẻ nhưng chủ yếu là để lưu trữ cấu trúc DB, và giới thiệu sự phức tạp (nhưng tôi thích nó :)). Nếu bạn chỉ cần lưu trữ String, Mảng và vân vân (cơ bản Prefs), bạn có thể đi với NSUserDefaults:

Ví dụ:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; //load NSUserDefaults 
NSArray *fakeFavs = [[ NSArray alloc] initWithObjects:@"2",@"4", @"100", nil]; //declare array to be stored in NSUserDefaults 
[prefs setObject:fakeFavs forKey:@"favourites"]; //set the prev Array for key value "favourites" 
+1

cảm ơn! làm thế nào để tôi đọc mảng này trở lại khi ứng dụng khởi chạy lại? – TommyG

+12

NSUserDefaults * prefs = [NSUserDefaults standardUserDefaults]; NSMutableArray * favorites = [prefs arrayForKey: @ "yêu thích"]; –

+1

Nếu chúng tôi đã giúp bạn, đừng quên bỏ phiếu! :) –

10

Bạn có về cơ bản hai lựa chọn để lưu trữ dữ liệu:

  1. CoreData (nếu bạn đang có kế hoạch để sử dụng phiên bản mới của iOS)
  2. SQLite (hỗ trợ mọi phiên bản của SDK)

CoreData sử dụng SQLite, API của nó dễ sử dụng hơn một chút (bạn không cần biết SQL hoặc viết nhiều hàm để đọc và ghi dữ liệu của bạn).

API SQLite vẫn là một lựa chọn tuyệt vời vì nó sử dụng API C cho SQLite, được viết rất tốt và dễ sử dụng. Nó có lợi ích mà bạn có thể nhắm mục tiêu nền tảng iOS cũ hơn với điều này.

Với cả hai tùy chọn, dữ liệu sẽ được lưu trữ phía máy khách và sẽ được sao lưu mỗi khi người dùng đồng bộ hóa điện thoại của họ với iTunes.

+0

SQLite không được sử dụng khi bạn có cơ sở dữ liệu trên máy chủ ở đâu đó? Tôi chỉ cần lưu trữ một đối tượng cục bộ và đọc nó/ghi vào nó. – TommyG

+0

@TommyG: Không. Mặc dù bạn về mặt kỹ thuật có thể sử dụng SQLite trong một máy chủ, tôi sẽ không khuyến khích bạn làm điều đó. Nó thiếu sự hỗ trợ truy cập đồng thời tốt. SQLite là một API cơ sở dữ liệu di động nhằm mục đích được sử dụng trong các môi trường người dùng đơn lẻ, chẳng hạn như iPhone, Điện thoại Android hoặc các ứng dụng máy tính để bàn đơn giản. CoreData sử dụng nó phía sau sân khấu. –

+0

tuyệt vời, cảm ơn tôi sẽ thử điều đó! – TommyG

4

nếu bạn chỉ cần lưu trữ một vài giá trị và không cần bất kỳ logic tìm kiếm, bạn có thể có một cái nhìn vào NSUserDefaults

[NSUserDefaults standardUserDefaults] 

chỉ của nó một cuốn từ điển, nơi bạn có thể lưu trữ mảng, chuỗi, int, đối tượng và truy cập bởi một NSString chính

nội bộ đó là một chỉ plist, vì vậy bạn có thể mở nó bằng xcode để quicky xem trạng thái hiện

+0

tôi có thể viết cho nó một chuỗi các chuỗi không, sau đó đọc nó vào lần tới khi người dùng mở ứng dụng? thats những gì tôi cần về cơ bản. tôi nhìn vào dữ liệu cốt lõi, và thành thật cho những gì tôi cần một quá mức của nó ... – TommyG

+0

Vâng, bạn có thể viết một chuỗi các chuỗi. [[NSUserDefaults standardUserDefaults] setObject: myArray forKey: @ "myKey"] và sau đó đọc lại với NSArray * myArray = [[NSUserDefaults standardUserDefaults] objectForKey: @ "myKey"]; – EricS

+0

có và nó được duy trì tự động. điều đó có nghĩa là nếu người dùng hoặc ios đóng ứng dụng, dữ liệu của bạn vẫn ở đó. và cũng được sao lưu bởi itunes – JeanLuc

0
Select Query:::::: 

NSArray *array_hiback =[app.sk lookupAllForSQL:@"SELECT * FROM cycle_datagathering_begoodyourselef ORDER BY RANDOM() LIMIT 1"]; 
    NSLog(@"%@",array_hiback);  

insert Query::::: 

NSMutableDictionary *dict=[[NSMutableDictionary alloc]init]; 
[dict setObject:@"0" forKey:@"isuploaded"]; 
     [app.sk insertDictionary:dict forTable:@"mindeditor"]; 
     [dict release]; 


update Query:::: 


    NSMutableDictionary *updatedata=[[NSMutableDictionary alloc]init]; 
[updatedata setObject: [[NSUserDefaults standardUserDefaults] objectForKey:@"savecycleid"] forKey:@"cycleid"]; 


delete Query::::: 

     [app.sk deleteWhere:[NSString stringWithFormat:@"rowid=%@",str] forTable:@"mindeditor"]; 

      [app.sk updateDictionary:updatedata forTable:@"mindeditor" where:[NSString stringWithFormat:@"rowid=%@", [[checkarray objectAtIndex:checkarray.count-1] objectForKey:@"cycleid"]]]; 
      [updatedata release]; 

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
     { 


      sk = [[SKDatabase alloc] init]; 
      NSString *db = @"MindEditor.db"; 
      [sk initWithDynamicFile:db]; 
      [email protected]"0"; 
     } 


     SKDatabase.h 


    // 
    // SKDatabase.h 
    // Version 1.1 
    // 
    // Created by Shannon Appelcline on 9/11/08. 
    // Copyright 2008 __MyCompanyName__. All rights reserved. 
    // 

    #import <UIKit/UIKit.h> 
    #import <sqlite3.h> 

    @protocol SKDatabaseDelegate <NSObject> 
    @optional 
    - (void)databaseTableWasUpdated:(NSString *)table; 
    @end 

    @interface SKDatabase : NSObject { 

     id<SKDatabaseDelegate> delegate; 
     sqlite3 *dbh; 
     BOOL dynamic; 
    } 

    @property (assign) id<SKDatabaseDelegate> delegate; 
    @property sqlite3 *dbh; 
    @property BOOL dynamic; 

    - (id)initWithFile:(NSString *)dbFile; 
    - (id)initWithDynamicFile:(NSString *)dbFile; 
    - (void)close; 

    - (sqlite3_stmt *)prepare:(NSString *)sql; 

    - (id)lookupColForSQL:(NSString *)sql; 
    - (NSDictionary *)lookupRowForSQL:(NSString *)sql; 
    - (NSArray *)lookupAllForSQL:(NSString *)sql; 

    - (int)lookupCountWhere:(NSString *)where forTable:(NSString *)table; 
    - (int)lookupMax:(NSString *)key Where:(NSString *)where forTable:(NSString *)table; 
    - (int)lookupSum:(NSString *)key Where:(NSString *)where forTable:(NSString *)table; 

    - (void)insertArray:(NSArray *)dbData forTable:(NSString *)table; 
    - (void)insertDictionary:(NSDictionary *)dbData forTable:(NSString *)table; 

    - (void)updateArray:(NSArray *)dbData forTable:(NSString *)table; 
    - (void)updateArray:(NSArray *)dbData forTable:(NSString *)table where:(NSString *)where; 
    - (void)updateDictionary:(NSDictionary *)dbData forTable:(NSString *)table; 
    - (void)updateDictionary:(NSDictionary *)dbData forTable:(NSString *)table where:(NSString *)where; 
    - (void)updateSQL:(NSString *)sql forTable:(NSString *)table; 

    - (void)deleteWhere:(NSString *)where forTable:(NSString *)table; 

    - (BOOL)runDynamicSQL:(NSString *)sql forTable:(NSString *)table; 

    @end 

     SKDatabase.m 




    // 
    // SKDatabase.m 
    // Version 1.1 
    // 
    // Created by Shannon Appelcline on 9/11/08. 
    // Copyright 2008 __MyCompanyName__. All rights reserved. 
    // 

    #import "SKDatabase.h" 

    @implementation SKDatabase 

    @synthesize delegate; 
    @synthesize dbh; 
    @synthesize dynamic; 

    // Two ways to init: one if you're just SELECTing from a database, one if you're UPDATing 
    // and or INSERTing 

    - (id)initWithFile:(NSString *)dbFile { 
     if (self = [super init]) { 

      NSString *paths = [[NSBundle mainBundle] resourcePath]; 
      NSString *path = [paths stringByAppendingPathComponent:dbFile]; 

      int result = sqlite3_open([path UTF8String], &dbh); 
      NSAssert1(SQLITE_OK == result, NSLocalizedStringFromTable(@"Unable to open the sqlite database (%@).", @"Database", @""), [NSString stringWithUTF8String:sqlite3_errmsg(dbh)]); 
      self.dynamic = NO; 
     } 

     return self;  
    } 

    - (id)initWithDynamicFile:(NSString *)dbFile { 
     if (self = [super init]) { 

      NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
      NSString *docDir = [docPaths objectAtIndex:0]; 
      NSString *docPath = [docDir stringByAppendingPathComponent:dbFile]; 

      NSFileManager *fileManager = [NSFileManager defaultManager]; 

      if (![fileManager fileExistsAtPath:docPath]) { 

       NSString *origPaths = [[NSBundle mainBundle] resourcePath]; 
       NSString *origPath = [origPaths stringByAppendingPathComponent:dbFile]; 

       NSError *error; 
       int success = [fileManager copyItemAtPath:origPath toPath:docPath error:&error];    
       NSAssert1(success,[NSString stringWithString:@"Failed to copy database into dynamic location"],error); 
      } 
      int result = sqlite3_open([docPath UTF8String], &dbh); 
      NSAssert1(SQLITE_OK == result, NSLocalizedStringFromTable(@"Unable to open the sqlite database (%@).", @"Database", @""), [NSString stringWithUTF8String:sqlite3_errmsg(dbh)]); 
      self.dynamic = YES; 
     } 

     return self;  
    } 

    // Users should never need to call prepare 

    - (sqlite3_stmt *)prepare:(NSString *)sql { 

     const char *utfsql = [sql UTF8String]; 

     sqlite3_stmt *statement; 

     if (sqlite3_prepare([self dbh],utfsql,-1,&statement,NULL) == SQLITE_OK) { 
      return statement; 
     } else { 
      return 0; 
     } 
    } 

    // Three ways to lookup results: for a variable number of responses, for a full row 
    // of responses, or for a singular bit of data 

    - (NSArray *)lookupAllForSQL:(NSString *)sql { 
     sqlite3_stmt *statement; 
     id result; 
     NSMutableArray *thisArray = [NSMutableArray arrayWithCapacity:4]; 
     if (statement = [self prepare:sql]) { 
      while (sqlite3_step(statement) == SQLITE_ROW) { 
       NSMutableDictionary *thisDict = [NSMutableDictionary dictionaryWithCapacity:4]; 
       for (int i = 0 ; i < sqlite3_column_count(statement) ; i++) 
       { 
        if (sqlite3_column_decltype(statement,i) != NULL && 
         strcasecmp(sqlite3_column_decltype(statement,i),"Boolean") == 0) 
        { 
         result = [NSNumber numberWithBool:(BOOL)sqlite3_column_int(statement,i)]; 
        } 
        else if (sqlite3_column_type(statement, i) == SQLITE_TEXT) 
        { 
         result = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,i)]; 
        } 
        else if 
         (sqlite3_column_type(statement,i) == SQLITE_INTEGER) 
        { 
         result = [NSNumber numberWithInt:(int)sqlite3_column_int(statement,i)]; 
        } 
        else if (sqlite3_column_type(statement,i) == SQLITE_FLOAT) 
        { 
         result = [NSNumber numberWithFloat:(float)sqlite3_column_double(statement,i)];     
        } 
        else 
        { 
         result = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,i)]; 
        } 
        if (result) 
        { 
         [thisDict setObject:result 
            forKey:[NSString stringWithUTF8String:sqlite3_column_name(statement,i)]]; 
        } 
       } 
       [thisArray addObject:[NSDictionary dictionaryWithDictionary:thisDict]]; 
       [thisArray retain]; 
      } 
     } 
     sqlite3_finalize(statement); 
     return thisArray; 
    } 

    - (NSDictionary *)lookupRowForSQL:(NSString *)sql { 
     sqlite3_stmt *statement; 
     id result; 
     NSMutableDictionary *thisDict = [NSMutableDictionary dictionaryWithCapacity:4]; 
     if (statement = [self prepare:sql]) 
     { 
      if (sqlite3_step(statement) == SQLITE_ROW) 
      { 
       for (int i = 0 ; i < sqlite3_column_count(statement) ; i++) 
       { 
        if (strcasecmp(sqlite3_column_decltype(statement,i),"Boolean") == 0) 
        { 
         result = [NSNumber numberWithBool:(BOOL)sqlite3_column_int(statement,i)]; 
        } 
        else if (sqlite3_column_type(statement, i) == SQLITE_TEXT) 
        { 
         result = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,i)]; 
        } 
        else if (sqlite3_column_type(statement,i) == SQLITE_INTEGER) 
        { 
         result = [NSNumber numberWithInt:(int)sqlite3_column_int(statement,i)]; 
        } 
        else if (sqlite3_column_type(statement,i) == SQLITE_FLOAT) 
        { 
         result = [NSNumber numberWithFloat:(float)sqlite3_column_double(statement,i)];     
        } 
        else 
        { 
         result = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,i)]; 
        } 
        if (result) 
        { 
         [thisDict setObject:result 
            forKey:[NSString stringWithUTF8String:sqlite3_column_name(statement,i)]]; 
        } 
       } 
      } 
     } 
     sqlite3_finalize(statement); 
     return thisDict; 
    } 

    - (id)lookupColForSQL:(NSString *)sql { 

     sqlite3_stmt *statement; 
     id result; 
     if (statement = [self prepare:sql]) { 
      if (sqlite3_step(statement) == SQLITE_ROW) {   
       if (strcasecmp(sqlite3_column_decltype(statement,0),"Boolean") == 0) { 
        result = [NSNumber numberWithBool:(BOOL)sqlite3_column_int(statement,0)]; 
       } else if (sqlite3_column_type(statement, 0) == SQLITE_TEXT) { 
        result = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,0)]; 
       } else if (sqlite3_column_type(statement,0) == SQLITE_INTEGER) { 
        result = [NSNumber numberWithInt:(int)sqlite3_column_int(statement,0)]; 
       } else if (sqlite3_column_type(statement,0) == SQLITE_FLOAT) { 
        result = [NSNumber numberWithDouble:(double)sqlite3_column_double(statement,0)];      
       } else { 
        result = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,0)]; 
       } 
      } 
     } 
     sqlite3_finalize(statement); 
     return result; 

    } 

    // Simple use of COUNTS, MAX, etc. 

    - (int)lookupCountWhere:(NSString *)where forTable:(NSString *)table { 

     int tableCount = 0; 
     NSString *sql = [NSString stringWithFormat:@"SELECT COUNT(*) FROM %@ WHERE %@", 
         table,where];  
     sqlite3_stmt *statement; 

     if (statement = [self prepare:sql]) { 
      if (sqlite3_step(statement) == SQLITE_ROW) {   
       tableCount = sqlite3_column_int(statement,0); 
      } 
     } 
     sqlite3_finalize(statement); 
     return tableCount; 

    } 

    - (int)lookupMax:(NSString *)key Where:(NSString *)where forTable:(NSString *)table { 

     int tableMax = 0; 
     NSString *sql = [NSString stringWithFormat:@"SELECT MAX(%@) FROM %@ WHERE %@", 
         key,table,where];  
     sqlite3_stmt *statement; 
     if (statement = [self prepare:sql]) { 
      if (sqlite3_step(statement) == SQLITE_ROW) {   
       tableMax = sqlite3_column_int(statement,0); 
      } 
     } 
     sqlite3_finalize(statement); 
     return tableMax; 

    } 

    - (int)lookupSum:(NSString *)key Where:(NSString *)where forTable:(NSString *)table { 

     int tableSum = 0; 
     NSString *sql = [NSString stringWithFormat:@"SELECT SUM(%@) FROM %@ WHERE %@", 
         key,table,where];  
     sqlite3_stmt *statement; 
     if (statement = [self prepare:sql]) { 
      if (sqlite3_step(statement) == SQLITE_ROW) {   
       tableSum = sqlite3_column_int(statement,0); 
      } 
     } 
     sqlite3_finalize(statement); 
     return tableSum; 

    } 

    // INSERTing and UPDATing 

    - (void)insertArray:(NSArray *)dbData forTable:(NSString *)table { 

    // NSMutableString *sql = [NSMutableString stringWithCapacity:16]; 
    // [sql appendFormat:@"INSERT INTO %@ (",table]; 
    // 
    // 
    // for (int i = 0 ; i < [dbData count] ; i++) { 
    //  NSLog(@"%@",[[dbData objectAtIndex:i] objectForKey:@"mid"]); 
    //  [sql appendFormat:@"%@",[[dbData objectAtIndex:i] objectForKey:@"key"]]; 
    //  if (i + 1 < [dbData count]) { 
    //   [sql appendFormat:@", "]; 
    //  } 
    // } 
    // [sql appendFormat:@") VALUES("]; 
    // for (int i = 0 ; i < [dbData count] ; i++) { 
    //  if ([[[dbData objectAtIndex:i] objectForKey:@"value"] intValue]) { 
    //   [sql appendFormat:@"%@",[[[dbData objectAtIndex:i] objectForKey:@"value"] intValue]]; 
    //  } else { 
    //   [sql appendFormat:@"'%@'",[[dbData objectAtIndex:i] objectForKey:@"value"]]; 
    //  } 
    //  if (i + 1 < [dbData count]) { 
    //   [sql appendFormat:@", "]; 
    //  } 
    // } 
    // [sql appendFormat:@")"]; 
    // [self runDynamicSQL:sql forTable:table]; 
     for(int i=0;i<[dbData count];i++) 
     { 
      NSDictionary *dict=[dbData objectAtIndex:i]; 
      NSMutableString *sql = [NSMutableString stringWithCapacity:16]; 
      [sql appendFormat:@"INSERT INTO %@ (",table]; 

      NSArray *dataKeys = [dict allKeys]; 
      for (int i = 0 ; i < [dataKeys count] ; i++) { 
       [sql appendFormat:@"%@",[dataKeys objectAtIndex:i]]; 
       if (i + 1 < [dataKeys count]) { 
        [sql appendFormat:@", "]; 
       } 
      } 

      [sql appendFormat:@") VALUES("]; 
      for (int i = 0 ; i < [dataKeys count] ; i++) { 
       if ([[dict objectForKey:[dataKeys objectAtIndex:i]] intValue]) { 
        [sql appendFormat:@"%@",[dict objectForKey:[dataKeys objectAtIndex:i]]]; 
       } else { 
        [sql appendFormat:@"'%@'",[dict objectForKey:[dataKeys objectAtIndex:i]]]; 
       } 
       if (i + 1 < [dict count]) { 
        [sql appendFormat:@", "]; 
       } 
      } 

      [sql appendFormat:@")"]; 
      [self runDynamicSQL:sql forTable:table]; 
     } 
    } 

    - (void)insertDictionary:(NSDictionary *)dbData forTable:(NSString *)table { 

     NSMutableString *sql = [NSMutableString stringWithCapacity:16]; 
     [sql appendFormat:@"INSERT INTO %@ (",table]; 

     NSArray *dataKeys = [dbData allKeys]; 
     for (int i = 0 ; i < [dataKeys count] ; i++) { 
      [sql appendFormat:@"%@",[dataKeys objectAtIndex:i]]; 
      if (i + 1 < [dbData count]) { 
       [sql appendFormat:@", "]; 
      } 
     } 

     [sql appendFormat:@") VALUES("]; 
     for (int i = 0 ; i < [dataKeys count] ; i++) { 
      //if ([[dbData objectForKey:[dataKeys objectAtIndex:i]] intValue]) { 
    //   [sql appendFormat:@"%@",[dbData objectForKey:[dataKeys objectAtIndex:i]]]; 
    //  } else { 

      [sql appendFormat:@"'%@'",[dbData objectForKey:[dataKeys objectAtIndex:i]]]; 
      //} 
      if (i + 1 < [dbData count]) { 
       [sql appendFormat:@", "]; 
      } 
     } 

     [sql appendFormat:@")"]; 
     [self runDynamicSQL:sql forTable:table]; 
    } 

    - (void)updateArray:(NSArray *)dbData forTable:(NSString *)table { 
     [self updateArray:dbData forTable:table where:NULL]; 
    } 

    - (void)updateArray:(NSArray *)dbData forTable:(NSString *)table where:(NSString *)where { 

     NSMutableString *sql = [NSMutableString stringWithCapacity:16]; 
     [sql appendFormat:@"UPDATE %@ SET ",table]; 

     for (int i = 0 ; i < [dbData count] ; i++) { 
      if ([[[dbData objectAtIndex:i] objectForKey:@"value"] intValue]) { 
       [sql appendFormat:@"%@=%@", 
       [[dbData objectAtIndex:i] objectForKey:@"key"], 
       [[dbData objectAtIndex:i] objectForKey:@"value"]]; 
      } else { 
       [sql appendFormat:@"%@='%@'", 
       [[dbData objectAtIndex:i] objectForKey:@"key"], 
       [[dbData objectAtIndex:i] objectForKey:@"value"]]; 
      }  
      if (i + 1 < [dbData count]) { 
       [sql appendFormat:@", "]; 
      } 
     } 
     if (where != NULL) { 
      [sql appendFormat:@" WHERE %@",where]; 
     } else { 
      [sql appendFormat:@" WHERE 1",where]; 
     }  
     [self runDynamicSQL:sql forTable:table]; 
    } 

    - (void)updateDictionary:(NSDictionary *)dbData forTable:(NSString *)table { 
     [self updateDictionary:dbData forTable:table where:NULL]; 
    } 

    - (void)updateDictionary:(NSDictionary *)dbData forTable:(NSString *)table where:(NSString *)where { 

     NSMutableString *sql = [NSMutableString stringWithCapacity:16]; 
     [sql appendFormat:@"UPDATE %@ SET ",table]; 

     NSArray *dataKeys = [dbData allKeys]; 
     for (int i = 0 ; i < [dataKeys count] ; i++) { 
      if ([[dbData objectForKey:[dataKeys objectAtIndex:i]] intValue]) { 
       [sql appendFormat:@"%@=%@", 
       [dataKeys objectAtIndex:i], 
       [dbData objectForKey:[dataKeys objectAtIndex:i]]]; 
      } else { 
       [sql appendFormat:@"%@='%@'", 
       [dataKeys objectAtIndex:i], 
       [dbData objectForKey:[dataKeys objectAtIndex:i]]]; 
      }  
      if (i + 1 < [dbData count]) { 
       [sql appendFormat:@", "]; 
      } 
     } 
     if (where != NULL) { 
      [sql appendFormat:@" WHERE %@",where]; 
     } 
     [self runDynamicSQL:sql forTable:table]; 
    } 

    - (void)updateSQL:(NSString *)sql forTable:(NSString *)table { 
     [self runDynamicSQL:sql forTable:table]; 
    } 

    - (void)deleteWhere:(NSString *)where forTable:(NSString *)table { 

     NSString *sql = [NSString stringWithFormat:@"DELETE FROM %@ WHERE %@", 
         table,where]; 
     [self runDynamicSQL:sql forTable:table]; 
    } 

    // INSERT/UPDATE/DELETE Subroutines 

    - (BOOL)runDynamicSQL:(NSString *)sql forTable:(NSString *)table { 

     int result; 
     //NSAssert1(self.dynamic == 1,[NSString stringWithString:@"Tried to use a dynamic function on a static database"],NULL); 
     sqlite3_stmt *statement; 
     if (statement = [self prepare:sql]) { 
      result = sqlite3_step(statement); 
     }  
     sqlite3_finalize(statement); 
     if (result) { 
      if (self.delegate != NULL && [self.delegate respondsToSelector:@selector(databaseTableWasUpdated:)]) { 
       [delegate databaseTableWasUpdated:table]; 
      } 
      return YES; 
     } else { 
      return NO; 
     } 

    } 

    // requirements for closing things down 

    - (void)dealloc { 
     [self close]; 
     [delegate release]; 
     [super dealloc]; 
    } 

    - (void)close { 

     if (dbh) { 
      sqlite3_close(dbh); 
     } 
    } 

    @end 
1

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

0
// Create Database file 

- (void)createEditableCopyOfDatabaseIfNeeded 
{ 
    // First, test for existence. 
    BOOL success; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSLog(@"%@",documentsDirectory); 
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"TestDB.sqlite"]; 
    success = [fileManager fileExistsAtPath:writableDBPath]; 
    if (success) return; 

    // The writable database does not exist, so copy the default to the appropriate location. 

    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"TestDB.sqlite"]; 
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 
    if (!success) { 
     NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); 
    } 
} 
+0

Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về lý do và/hoặc cách trả lời câu hỏi sẽ cải thiện đáng kể giá trị lâu dài của nó. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích. – gevorg

1

Bạn có một vài cách khác nhau để lưu trữ dữ liệu ứng dụng trên iPhone của mình.

  1. file Plist
  2. NSUserDefaults
  3. UserDefault
  4. File System
  5. CoreData
  6. SQLite DB
Các vấn đề liên quan