2011-11-07 15 views
23

Sto costruendo un'app in cui mi piacerebbe archiviare le informazioni utente localmente sul dispositivo, senza utilizzare alcun database server, ma tutto sul lato dispositivo. Sto cercando di memorizzare posizioni utente specifiche e mostrarle in una vista tabella, e quindi anche quando l'utente avvia l'app in un secondo momento, posso estrarre la cronologia e inserire nella tabella della cronologia le posizioni passate. Fondamentalmente una capacità di lettura/scrittura da un database locale.memorizzando i dati localmente sull'iPhone

Ora, so che c'erano molte domande simili prima, ma non sono riuscito a trovarne una che risolva il salvataggio dei dati localmente senza un database esterno. Ad esempio, non sono sicuro che l'utilizzo di Core Data sia la cosa giusta e più semplice da fare qui.

Apprezzerebbero qualsiasi consiglio al riguardo.

+0

Controllare questa domanda/risposta: http: // StackOverflow .c om/questions/307313/best-way-to-save-data-on-the-iphone – Ralfonso

+0

Se il problema è risolto, dovresti controllare la tua domanda come risolta e scegliere una risposta per aiutare le persone in futuro con lo stesso problema –

+0

hey @TommyG memorizza i record transazionali, nel tuo caso le informazioni sulla posizione sono migliori per utilizzare database esterni come SqLite o CoreDate piuttosto che usare NSUserDefaults [https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/ NSUserDefaults_Class /]. Quindi, per semplificarti la vita, prova a provare una libreria ORM come https://github.com/LakithaRav/OLCOrm per completare il lavoro. – Laky

risposta

63

per i dati semplice si dovrebbe usare NSUserDefaults. CoreData è molto interessante, ma principalmente per archiviare strutture DB e introduce complessità (ma mi piace :)). Se avete solo bisogno di memorizzare String, Array e così via (in pratica Preferenze), si può andare con NSUserDefaults:

Ad esempio:

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

grazie! Come posso leggere questo array quando l'app si avvia di nuovo? – TommyG

+12

NSUserDefaults * prefs = [NSUserDefaults standardUserDefaults]; NSMutableArray * favorites = [prefs arrayForKey: @ "preferiti"]; –

+1

Se ti abbiamo aiutato, non dimenticare di votare! :) –

10

Si sono fondamentalmente due opzioni per memorizzare i dati:

  1. CoreData (se si prevede di utilizzare le versioni più recenti di iOS)
  2. SQLite (supporta qualsiasi versione del SDK)

CoreData utilizza SQLite, la sua API è un po 'più facile da usare (non è necessario conoscere SQL o scrivere molte funzioni per leggere e scrivere i dati).

SQLite API è ancora un'ottima scelta, poiché utilizza l'API C per SQLite, che è molto ben documentata e semplice da utilizzare. Ha il vantaggio di poter indirizzare le vecchie piattaforme iOS con questo.

Con entrambe le opzioni, i dati verranno archiviati sul lato client e verranno supportati ogni volta che l'utente sincronizza il proprio telefono con iTunes.

+0

SQLite non è utilizzato quando si dispone di una base dati su un server da qualche parte? Ho solo bisogno di memorizzare un oggetto localmente e leggerlo/scriverlo. – TommyG

+0

@ TommyG: No. Anche se tecnicamente potresti usare SQLite in un server, ti scoraggio molto di farlo. Manca un buon supporto di accesso simultaneo. SQLite è un'API di database mobile destinata a essere utilizzata in ambienti per utenti singoli, quali iPhone, telefoni Android o semplici applicazioni desktop. CoreData lo utilizza dietro il palco. –

+0

cool, grazie ci proverò allora! – TommyG

4

se solo la memorizzazione di alcuni valori e non è necessario alcun logica di ricerca, si potrebbe dare un'occhiata in NSUserDefaults

[NSUserDefaults standardUserDefaults] 

il suo solo un dizionario in cui è possibile memorizzare array, stringhe, int, oggetti e l'accesso da un NSString chiave

internamente si tratta di un solo plist, in modo da poter aprire con Xcode per vedere quicky lo stato attuale

+0

posso scrivere su di esso una serie di stringhe, quindi leggerlo la prossima volta che l'utente apre l'app? questo è quello che ho bisogno fondamentalmente. Ho esaminato i dati principali e onestamente per quello che mi serve è un overkill ... – TommyG

+0

Sì, è possibile scrivere una serie di stringhe. [[NSUserDefaults standardUserDefaults] setObject: myArray forKey: @ "myKey"] e quindi rileggerlo con NSArray * myArray = [[NSUserDefaults standardUserDefaults] objectForKey: @ "myKey"]; – EricS

+0

sì e viene mantenuto automaticamente. questo significa che se l'utente o ios chiude l'app, i tuoi dati sono ancora lì. e anche il backup di 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

mi consiglia di utilizzare Realm per soluzioni più generalizzate.

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

Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo sul perché e/o su come risponde alla domanda migliorerebbe significativamente il suo valore a lungo termine. Per favore modifica la tua risposta per aggiungere qualche spiegazione. – gevorg

1

Hai diversi modi per archiviare i dati dell'applicazione sul tuo iPhone.

  1. plist
  2. NSUserDefaults
  3. USERDEFAULT
  4. File System
  5. CoreData
  6. SQLite DB
Problemi correlati