在iPhone上本地存储数据

26
我正在开发一个应用程序,希望在设备上本地存储用户信息,不使用任何服务器数据库——一切都在设备端完成。我想要存储特定的用户位置并在表视图中显示它,这样即使用户之后再次启动应用程序,我也可以提取历史记录并将历史表填充以前的位置。基本上需要从本地数据库进行读写操作。
现在,我知道以前有许多类似的问题,但我找不到一个能够解决不使用外部数据库保存数据的问题。例如,我不确定在这里使用Core Data是否正确和最简单的方法。
希望得到任何关于这个问题的建议。

请查看以下问题/答案:https://dev59.com/d3VC5IYBdhLWcg3wZwNT - Ralfonso
如果问题已经解决,您应该将其标记为已解决,并选择一个答案,以帮助未来遇到相同问题的人。 - Sr.Richie
嘿@TommyG,如果要存储事务记录,尤其是位置信息的话,最好使用外部数据库,如SqLite或CoreDate,而不是使用NSUserDefaults [https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/]。因此,为了让您的生活更轻松,不妨尝试一下ORM库,例如https://github.com/LakithaRav/OLCOrm来完成工作。 - Laky
6个回答

64

对于简单的数据,您应该使用NSUserDefaults。CoreData非常酷,但主要用于存储数据库结构,并引入了复杂性(但我喜欢它:))。如果您只需要存储字符串、数组等数据(基本上是偏好设置),则可以使用NSUserDefaults:

例如:

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
谢谢!当应用程序再次启动时,我该如何读取这个数组? - TommyG
13
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];这行代码创建了一个名为prefs的NSUserDefaults实例,用于访问应用程序的持久性数据存储。 NSMutableArray *favorites = [prefs arrayForKey:@"favourites"];这行代码使用prefs实例从存储中获取一个名为“favourites”的数组,并将其分配给favorites可变数组。 - Sr.Richie
1
除了Sr.Richie的评论之外,如果您想要添加/删除对象,获取存储数组的可变副本是必不可少的。NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; NSMutableArray *favorites = [[prefs arrayForKey:@"favourites"] mutableCopy]; - DigitalNinja

10

存储数据有两个基本的选择:

  1. CoreData(如果您计划使用较新版本的iOS)
  2. SQLite(支持任何版本的SDK)

CoreData使用SQLite,其API稍微更容易使用(您不需要了解SQL或编写大量函数来读取和写入您的数据)。

SQLite API仍然是一个很好的选择,因为它使用SQLite的C API,这非常好地记录并且易于使用。使用该选项可以将其针对旧版的iOS平台。

无论哪种选择,数据都将在客户端存储,并且每次用户通过iTunes同步手机时都会进行备份。


SQLite不是用于在服务器上拥有数据库时使用的吗?我只需要在本地存储一个对象并读取/写入它。 - TommyG
@TommyG:不行。虽然你在服务器上理论上可以使用SQLite,但我强烈不建议这样做。它缺乏良好的并发访问支持。SQLite是一个移动数据库API,旨在用于单用户环境,例如iPhone、Android手机或简单的桌面应用程序。CoreData在幕后使用它。 - Pablo Santa Cruz

4
如果您只是存储少量值并且不需要任何搜索逻辑,您可以查看NSUserDefaults
[NSUserDefaults standardUserDefaults] 

这只是一个字典,你可以在其中存储数组、字符串、整数、对象,并通过NSString键访问。
内部实际上是一个属性列表(plist),所以你可以使用Xcode打开它,快速查看当前状态。

我可以将一个字符串数组写入其中,然后在用户下次打开应用程序时读取它吗?基本上这就是我需要的。我研究了核心数据,老实说,对于我所需的东西来说,它有些过度设计了... - TommyG
是的,你可以编写一个字符串数组。[[NSUserDefaults standardUserDefaults] setObject:myArray forKey:@"myKey"] 然后使用 NSArray *myArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"myKey"]; 读取它。 - EricS
是的,它会自动持久化。这意味着如果用户或iOS关闭应用程序,您的数据仍然存在,并且还由iTunes备份。 - JeanLuc

4

您有几种不同的方式可以在iPhone上存储应用程序数据。

  1. Plist文件
  2. NSUserDefaults
  3. UserDefault
  4. 文件系统
  5. CoreData
  6. SQLite数据库

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]);
    }
}

虽然这段代码可能回答了问题,但提供关于为什么和/或如何回答问题的额外上下文会显著提高其长期价值。请编辑您的答案以添加一些解释。 - gevorg

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];
            userid=@"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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接