首页 > 代码库 > 第六十六篇、OC_Sqlite数据库操作

第六十六篇、OC_Sqlite数据库操作

 

#import <Foundation/Foundation.h>
#import <sqlite3.h>
#define kFilename   @"data.sqlite"

@interface SQLService:NSObject
{
    NSMutableArray *FSQLExecutioResultsMutableArray;    //SQL运行结果
    NSString *FErrorString;     //错误信息
    NSString *FDatabaseAddressString;       //数据库文件存放地址
}

@property (nonatomic) sqlite3 *FDatabaseSqlite;

- (void)SetDatabaseAddressString:(NSString *)ANewString;
- (NSString *)GetErrorString;
- (NSMutableArray *)GetSQLExecutioResultsMutableArray;

//- (BOOL)ExecuteSQL:(NSString *)ASQLString;
- (BOOL)CreateTable:(NSString *)ASQLString;
- (BOOL)InsertData:(NSString *)ASQLString;
- (BOOL)DeleteData:(NSString *)ASQLString;
- (BOOL)UpdateData:(NSString *)ASQLString;
- (BOOL)SelectData:(NSString *)ASQLString;
- (BOOL)SelectAllData:(NSString *)ASQLString;
- (BOOL)DropTable:(NSString *)ASQLString;
@end

 

#import "SQLService.h"
#define kLibrary [NSHomeDirectory() stringByAppendingPathComponent:@"Library"]
@interface SQLService ()

- (void)SetErrorString:(NSString *)ANewString;
- (void)SetSQLExecutioResultsMutableArray:(NSMutableArray *)ANewMutableArray;
- (NSString *)GetDatabaseAddressString;

- (NSString *)DataFilePath;
- (BOOL)OpenDataBase;

- (BOOL)CreateTable:(NSString *)ASQLString;
@end

@implementation SQLService
@synthesize FDatabaseSqlite;

- (id)init
{
    if (![self GetSQLExecutioResultsMutableArray]) {
        NSMutableArray *ASQLExecutioResultsMutableArray = [[NSMutableArray alloc] initWithCapacity:1];
        [self SetSQLExecutioResultsMutableArray:ASQLExecutioResultsMutableArray];
        [ASQLExecutioResultsMutableArray release];
    }
    if (![self GetErrorString]) {
        NSString *AErrorString = [[NSString alloc] init];
        [self SetErrorString:AErrorString];
        [AErrorString release];
    }
    return self;
}

- (void)dealloc
{
    [FSQLExecutioResultsMutableArray release];
    [super dealloc];
}

- (void)SetDatabaseAddressString:(NSString *)ANewString
{
    FDatabaseAddressString = [ANewString retain];
}
- (NSString *)GetDatabaseAddressString
{
    return FDatabaseAddressString;
}
- (void)SetErrorString:(NSString *)ANewString
{
    if (FErrorString != ANewString) {
        [FErrorString release];
        FErrorString = [ANewString retain];
    }
}
- (NSString *)GetErrorString
{
    return FErrorString;
}
- (void)SetSQLExecutioResultsMutableArray:(NSMutableArray *)ANewMutableArray
{
    if (FSQLExecutioResultsMutableArray != ANewMutableArray) {
        [FSQLExecutioResultsMutableArray release];
        FSQLExecutioResultsMutableArray = [ANewMutableArray retain];
    }
}
- (NSMutableArray *)GetSQLExecutioResultsMutableArray
{
    return FSQLExecutioResultsMutableArray;
}

//获取document目录并返回数据库目录
- (NSString *)DataFilePath
{
    NSString *ADataFilePathString;
    ADataFilePathString = [kLibrary stringByAppendingPathComponent:kFilename];
    return ADataFilePathString;
}
//创建、打开数据库
- (BOOL)OpenDataBase 
{
    BOOL AIsOpenSuccessedBool;
    //获取数据库路径
    NSString *ADataFilePathString = [self DataFilePath];
    //文件管理器
    NSFileManager *AFileManager = [NSFileManager defaultManager];
    //判断数据库是否存在
    BOOL AIsDataBaseExistBool = [AFileManager fileExistsAtPath:ADataFilePathString];
    
    //如果数据库存在,则用sqlite3_open直接打开(不要担心,如果数据库不存在sqlite3_open会自动创建)
    if (AIsDataBaseExistBool) {
       // NSLog(@"Database file have already existed.");
        //打开数据库,这里的[path UTF8String]是将NSString转换为C字符串,因为SQLite3是采用可移植的C(而不是
        //Objective-C)编写的,它不知道什么是NSString.
        const char *ATempChar = [ADataFilePathString UTF8String];
        if(sqlite3_open(ATempChar, &FDatabaseSqlite) != SQLITE_OK) {
            
            //如果打开数据库失败则关闭数据库
            sqlite3_close(FDatabaseSqlite);
            //NSLog(@"Error: open database file failed.");
            [self SetErrorString:@"Error: open database file failed."];
            AIsOpenSuccessedBool = NO;
        }
        else {
            AIsOpenSuccessedBool = YES;
        }
    }
    //如果发现数据库不存在则利用sqlite3_open创建数据库(上面已经提到过),与上面相同,路径要转换为C字符串
    else if(sqlite3_open([ADataFilePathString UTF8String], &FDatabaseSqlite) == SQLITE_OK) {
        AIsOpenSuccessedBool = YES;
    } 
    else {
        //如果创建并打开数据库失败则关闭数据库
        sqlite3_close(FDatabaseSqlite);
        //NSLog(@"Error: create and open database file failed.");
        [self SetErrorString:@"Error: create and open database file failed."];
        AIsOpenSuccessedBool = NO;
    }
    return AIsOpenSuccessedBool;
}
/*
- (BOOL)ExecuteSQL:(NSString *)ASQLString
{
    BOOL AIsSuccessedBool;
    if ([self OpenDataBase]) {
        sqlite3_stmt *AStatementSqlite3_stmt;
        NSString *AErrorString = nil;
        NSMutableArray *ASQLExecutioResultsMutableArray = [self GetSQLExecutioResultsMutableArray];
        [ASQLExecutioResultsMutableArray removeAllObjects];
        const char *ASQLChar = [ASQLString UTF8String];
        //sqlite3_prepare_v2 接口把一条SQL语句解析到statement结构里去. 使用该接口访问数据库是当前比较好的的一种方法
        NSInteger AParseSQLReturnInteger = sqlite3_prepare_v2(FDatabaseSqlite, ASQLChar, -1, &AStatementSqlite3_stmt, nil);
        //第一个参数跟前面一样,是个sqlite3 * 类型变量,
        //第二个参数是一个 sql 语句。
        //第三个参数我写的是-1,这个参数含义是前面 sql 语句的长度。如果小于0,sqlite会自动计算它的长度(把sql语句当成以\0结尾的字符串)。
        //第四个参数是sqlite3_stmt 的指针的指针。解析以后的sql语句就放在这个结构里。
        //第五个参数我也不知道是干什么的。为nil就可以了。
        //如果这个函数执行成功(返回值是 SQLITE_OK 且 statement 不为NULL ),那么下面就可以开始插入二进制数据。
        
        //如果SQL语句解析出错
        if(AParseSQLReturnInteger != SQLITE_OK) {
            //NSLog(@"Error: Parse SQL failed");
            AIsSuccessedBool = NO;
            AErrorString = [[NSString alloc] initWithFormat:@"Error: %s", sqlite3_errmsg(FDatabaseSqlite)];
            [self SetErrorString:AErrorString];
            [AErrorString release];
        }
        else {
            NSString *AOperationString = [ASQLString substringToIndex:6];
            if ([AOperationString caseInsensitiveCompare:@"create"] == NSOrderedSame) {
                [self CreateTable:ASQLChar Statement:AStatementSqlite3_stmt];
            }
            else if ([AOperationString caseInsensitiveCompare:@"INSERT"] == NSOrderedSame) {
                [self InsertData:ASQLChar Statement:AStatementSqlite3_stmt];
            }
            else if ([AOperationString caseInsensitiveCompare:@"delete"] == NSOrderedSame) {
                [self DeleteData:ASQLChar Statement:AStatementSqlite3_stmt];
            }
            else if ([AOperationString caseInsensitiveCompare:@"update"] == NSOrderedSame) {
                [self UpdateData:ASQLChar Statement:AStatementSqlite3_stmt];
            }
            else if ([AOperationString caseInsensitiveCompare:@"SELECT"] == NSOrderedSame) {
                [self SelectData:ASQLChar Statement:AStatementSqlite3_stmt];
            }
            else if ([[AOperationString substringToIndex:4] caseInsensitiveCompare:@"drop"] == NSOrderedSame) {
                [self DropTable:ASQLChar Statement:AStatementSqlite3_stmt];
            }
            AIsSuccessedBool = YES;
        }
        
        //释放sqlite3_stmt 
        sqlite3_finalize(AStatementSqlite3_stmt);
        //关闭数据库
        sqlite3_close(FDatabaseSqlite);
    }
    return AIsSuccessedBool;
}
*/
- (BOOL)CreateTable:(NSString *)ASQLString
{
    BOOL AIsSuccessedBool=NO;
    if ([self OpenDataBase]) {
        
       // NSLog(@"CreateTable%@",ASQLString);
        
        sqlite3_stmt *AStatementSqlite3_stmt;
        NSString *AErrorString = nil;
        NSMutableArray *ASQLExecutioResultsMutableArray = [self GetSQLExecutioResultsMutableArray];
        [ASQLExecutioResultsMutableArray removeAllObjects];
        const char *ASQLChar = [ASQLString UTF8String];

        //sqlite3_prepare_v2 接口把一条SQL语句解析到statement结构里去. 使用该接口访问数据库是当前比较好的的一种方法
        NSInteger AParseSQLReturnInteger = sqlite3_prepare_v2(FDatabaseSqlite, ASQLChar, -1, &AStatementSqlite3_stmt, nil);
        
        //如果SQL语句解析出错
        if(AParseSQLReturnInteger != SQLITE_OK) {
            //NSLog(@"Error: Parse SQL failed");
            AIsSuccessedBool = NO;
            AErrorString = [[NSString alloc] initWithFormat:@"Error: %s", sqlite3_errmsg(FDatabaseSqlite)];
            [self SetErrorString:AErrorString];
            [AErrorString release];
        }
        else {
            //执行SQL语句
            int AExecuteSQLReturnInt = sqlite3_step(AStatementSqlite3_stmt);
            
            if (AExecuteSQLReturnInt != SQLITE_DONE)
            {
                AErrorString = [[NSString alloc] initWithFormat:@"Create Table failed!"];
                [self SetErrorString:AErrorString];
                [AErrorString release];
                AIsSuccessedBool = NO;
            }
            else {
                [self SetErrorString:@"Create Table Successed"];
                AIsSuccessedBool = YES;
            }
        }
        //释放sqlite3_stmt 
        sqlite3_finalize(AStatementSqlite3_stmt);
        //关闭数据库
        sqlite3_close(FDatabaseSqlite);
    }
    return AIsSuccessedBool;
}

- (BOOL)InsertData:(NSString *)ASQLString
{
    BOOL AIsSuccessedBool=NO;
    if ([self OpenDataBase]) {
        sqlite3_stmt *AStatementSqlite3_stmt;
        NSString *AErrorString = nil;
        NSMutableArray *ASQLExecutioResultsMutableArray = [self GetSQLExecutioResultsMutableArray];
        [ASQLExecutioResultsMutableArray removeAllObjects];
        const char *ASQLChar = [ASQLString UTF8String];
        //sqlite3_prepare_v2 接口把一条SQL语句解析到statement结构里去. 使用该接口访问数据库是当前比较好的的一种方法
        NSInteger AParseSQLReturnInteger = sqlite3_prepare_v2(FDatabaseSqlite, ASQLChar, -1, &AStatementSqlite3_stmt, nil);
        
        //如果SQL语句解析出错
        if(AParseSQLReturnInteger != SQLITE_OK) {
            //NSLog(@"Error: Parse SQL failed");
            AIsSuccessedBool = NO;
            AErrorString = [[NSString alloc] initWithFormat:@"Error: %s", sqlite3_errmsg(FDatabaseSqlite)];
            [self SetErrorString:AErrorString];
            [AErrorString release];
        }
        else {
            //执行SQL语句
            int AExecuteSQLReturnInt = sqlite3_step(AStatementSqlite3_stmt);
            if (AExecuteSQLReturnInt == SQLITE_ERROR)
            {
                AErrorString = [[NSString alloc] initWithFormat:@"Insert Data failed!"];
                [self SetErrorString:AErrorString];
                [AErrorString release];
                AIsSuccessedBool = NO;
            }
            else {
                [self SetErrorString:@"Insert Data Successed"];
                AIsSuccessedBool = YES;
            }
        }
        //释放sqlite3_stmt 
        sqlite3_finalize(AStatementSqlite3_stmt);
        //关闭数据库
        sqlite3_close(FDatabaseSqlite);
    }
    return AIsSuccessedBool;
}

- (BOOL)DeleteData:(NSString *)ASQLString
{
    BOOL AIsSuccessedBool=NO;
    if ([self OpenDataBase]) {
        sqlite3_stmt *AStatementSqlite3_stmt;
        NSString *AErrorString = nil;
        NSMutableArray *ASQLExecutioResultsMutableArray = [self GetSQLExecutioResultsMutableArray];
        [ASQLExecutioResultsMutableArray removeAllObjects];
        const char *ASQLChar = [ASQLString UTF8String];
        //sqlite3_prepare_v2 接口把一条SQL语句解析到statement结构里去. 使用该接口访问数据库是当前比较好的的一种方法
        NSInteger AParseSQLReturnInteger = sqlite3_prepare_v2(FDatabaseSqlite, ASQLChar, -1, &AStatementSqlite3_stmt, nil);
        
        //如果SQL语句解析出错
        if(AParseSQLReturnInteger != SQLITE_OK) {
            //NSLog(@"Error: Parse SQL failed");
            AIsSuccessedBool = NO;
            AErrorString = [[NSString alloc] initWithFormat:@"Error: %s", sqlite3_errmsg(FDatabaseSqlite)];
            [self SetErrorString:AErrorString];
            [AErrorString release];
        }
        else {
            //执行SQL语句
            int AExecuteSQLReturnInt = sqlite3_step(AStatementSqlite3_stmt);
            
            if (AExecuteSQLReturnInt == SQLITE_ERROR)
            {
                AErrorString = [[NSString alloc] initWithFormat:@"Delete Data failed!"];
                [self SetErrorString:AErrorString];
                [AErrorString release];
                AIsSuccessedBool = NO;
            }
            else {
                [self SetErrorString:@"Delete Data Successed"];
                AIsSuccessedBool = YES;
            }
        }
        //释放sqlite3_stmt 
        sqlite3_finalize(AStatementSqlite3_stmt);
        //关闭数据库
        sqlite3_close(FDatabaseSqlite);
    }
    return AIsSuccessedBool;
}

- (BOOL)UpdateData:(NSString *)ASQLString
{
    BOOL AIsSuccessedBool=NO;
    if ([self OpenDataBase]) {
        sqlite3_stmt *AStatementSqlite3_stmt;
        NSString *AErrorString = nil;
        NSMutableArray *ASQLExecutioResultsMutableArray = [self GetSQLExecutioResultsMutableArray];
        [ASQLExecutioResultsMutableArray removeAllObjects];
        const char *ASQLChar = [ASQLString UTF8String];
        //sqlite3_prepare_v2 接口把一条SQL语句解析到statement结构里去. 使用该接口访问数据库是当前比较好的的一种方法
        NSInteger AParseSQLReturnInteger = sqlite3_prepare_v2(FDatabaseSqlite, ASQLChar, -1, &AStatementSqlite3_stmt, nil);
        
        //如果SQL语句解析出错
        if(AParseSQLReturnInteger != SQLITE_OK) {
            //NSLog(@"Error: Parse SQL failed");
            AIsSuccessedBool = NO;
            AErrorString = [[NSString alloc] initWithFormat:@"Error: %s", sqlite3_errmsg(FDatabaseSqlite)];
            [self SetErrorString:AErrorString];
            [AErrorString release];
        }
        else {
            //执行SQL语句
            int AExecuteSQLReturnInt = sqlite3_step(AStatementSqlite3_stmt);
            
            if (AExecuteSQLReturnInt == SQLITE_ERROR)
            {
                AErrorString = [[NSString alloc] initWithFormat:@"Update Data failed!"];
                [self SetErrorString:AErrorString];
                [AErrorString release];
                AIsSuccessedBool = NO;
            }
            else {
                [self SetErrorString:@"Update Data Successed"];
                AIsSuccessedBool = YES;
            }
        }
        //释放sqlite3_stmt 
        sqlite3_finalize(AStatementSqlite3_stmt);
        //关闭数据库
        sqlite3_close(FDatabaseSqlite);
    }
    return AIsSuccessedBool;
}

- (BOOL)SelectData:(NSString *)ASQLString
{
    BOOL AIsSuccessedBool=NO;
    if ([self OpenDataBase]) {
        sqlite3_stmt *AStatementSqlite3_stmt;
        NSString *AErrorString = nil;
        NSMutableArray *ASQLExecutioResultsMutableArray = [self GetSQLExecutioResultsMutableArray];
        [ASQLExecutioResultsMutableArray removeAllObjects];
        const char *ASQLChar = [ASQLString UTF8String];
        //sqlite3_prepare_v2 接口把一条SQL语句解析到statement结构里去. 使用该接口访问数据库是当前比较好的的一种方法
        NSInteger AParseSQLReturnInteger = sqlite3_prepare_v2(FDatabaseSqlite, ASQLChar, -1, &AStatementSqlite3_stmt, nil);
        
        //如果SQL语句解析出错
        if(AParseSQLReturnInteger != SQLITE_OK) {
            //NSLog(@"Error: Parse SQL failed");
            AIsSuccessedBool = NO;
            AErrorString = [[NSString alloc] initWithFormat:@"Error: %s", sqlite3_errmsg(FDatabaseSqlite)];
            [self SetErrorString:AErrorString];
            [AErrorString release];
        }
        else {
            NSMutableArray *ASQLExecutioResultsMutableArray = [self GetSQLExecutioResultsMutableArray];
            char *ATempChar;
            NSUInteger ANumberOLineDatasUInteger;   //每行数据个数
            NSUInteger AIndexUInteger;
            NSString *ATempString;
            //NSUInteger ASqliteColumnTypeUInteger;   //某列数据类型
            //执行SQL语句
            while (sqlite3_step(AStatementSqlite3_stmt) == SQLITE_ROW) {
                ANumberOLineDatasUInteger = sqlite3_column_count(AStatementSqlite3_stmt);
                for (AIndexUInteger = 0; AIndexUInteger < ANumberOLineDatasUInteger; AIndexUInteger++) {
                     ATempChar = (char*)sqlite3_column_text(AStatementSqlite3_stmt, AIndexUInteger);
                     if (ATempChar!=nil) {
                         ATempString=[[NSString alloc] initWithCString:ATempChar encoding:NSUTF8StringEncoding];                         
                        }
                     else {
                        ATempString=[[NSString alloc] initWithFormat:@""];
                     }
                    [ASQLExecutioResultsMutableArray addObject:ATempString];
                     [ATempString release];
                }
            }
            AIsSuccessedBool = YES;
     
        }
        //释放sqlite3_stmt 
        sqlite3_finalize(AStatementSqlite3_stmt);
        //关闭数据库
        sqlite3_close(FDatabaseSqlite);
    }
    return AIsSuccessedBool;
}
- (BOOL)SelectAllData:(NSString *)ASQLString
{
    BOOL AIsSuccessedBool=NO;
    if ([self OpenDataBase]) {
        sqlite3_stmt *AStatementSqlite3_stmt;
        NSString *AErrorString = nil;
        NSMutableArray *ASQLExecutioResultsMutableArray = [self GetSQLExecutioResultsMutableArray];
        [ASQLExecutioResultsMutableArray removeAllObjects];
        const char *ASQLChar = [ASQLString UTF8String];
        //sqlite3_prepare_v2 接口把一条SQL语句解析到statement结构里去. 使用该接口访问数据库是当前比较好的的一种方法
        NSInteger AParseSQLReturnInteger = sqlite3_prepare_v2(FDatabaseSqlite, ASQLChar, -1, &AStatementSqlite3_stmt, nil);
        
        //如果SQL语句解析出错
        if(AParseSQLReturnInteger != SQLITE_OK) {
            //NSLog(@"Error: Parse SQL failed");
            AIsSuccessedBool = NO;
            AErrorString = [[NSString alloc] initWithFormat:@"Error: %s", sqlite3_errmsg(FDatabaseSqlite)];
            [self SetErrorString:AErrorString];
            [AErrorString release];
        }
        else {
            NSMutableArray *ASQLExecutioResultsMutableArray = [self GetSQLExecutioResultsMutableArray];
            char *ATempChar;
            NSUInteger ANumberOLineDatasUInteger;   //每行数据个数
            NSUInteger AIndexUInteger;
            NSString *ATempString;
            //NSUInteger ASqliteColumnTypeUInteger;   //某列数据类型
            //执行SQL语句
            while (sqlite3_step(AStatementSqlite3_stmt) == SQLITE_ROW) {
                ANumberOLineDatasUInteger = sqlite3_column_count(AStatementSqlite3_stmt);
                NSMutableArray *ARowMutableArray=[[NSMutableArray alloc] initWithCapacity:1];
                for (AIndexUInteger = 0; AIndexUInteger < ANumberOLineDatasUInteger; AIndexUInteger++) {
                    ATempChar = (char*)sqlite3_column_text(AStatementSqlite3_stmt, AIndexUInteger);
                    if (ATempChar!=nil) {
                        ATempString=[[NSString alloc] initWithCString:ATempChar encoding:NSUTF8StringEncoding];                         
                    }
                    else {
                        ATempString=[[NSString alloc] initWithFormat:@""];
                    }
                    [ARowMutableArray addObject:ATempString];
                    [ATempString release];
                }
                [ASQLExecutioResultsMutableArray addObject:ARowMutableArray];
                [ARowMutableArray release];
            }
            AIsSuccessedBool = YES;
            
        }
        //释放sqlite3_stmt 
        sqlite3_finalize(AStatementSqlite3_stmt);
        //关闭数据库
        sqlite3_close(FDatabaseSqlite);
    }
    return AIsSuccessedBool;
}


- (BOOL)DropTable:(NSString *)ASQLString
{
    BOOL AIsSuccessedBool=NO;
    if ([self OpenDataBase]) {
        sqlite3_stmt *AStatementSqlite3_stmt;
        NSString *AErrorString = nil;
        NSMutableArray *ASQLExecutioResultsMutableArray = [self GetSQLExecutioResultsMutableArray];
        [ASQLExecutioResultsMutableArray removeAllObjects];
        const char *ASQLChar = [ASQLString UTF8String];
        //sqlite3_prepare_v2 接口把一条SQL语句解析到statement结构里去. 使用该接口访问数据库是当前比较好的的一种方法
        NSInteger AParseSQLReturnInteger = sqlite3_prepare_v2(FDatabaseSqlite, ASQLChar, -1, &AStatementSqlite3_stmt, nil);
        
        //如果SQL语句解析出错
        if(AParseSQLReturnInteger != SQLITE_OK) {
            //NSLog(@"Error: Parse SQL failed");
            AIsSuccessedBool = NO;
            AErrorString = [[NSString alloc] initWithFormat:@"Error: %s", sqlite3_errmsg(FDatabaseSqlite)];
            [self SetErrorString:AErrorString];
            [AErrorString release];
        }
        else {
            //执行SQL语句
            int AExecuteSQLReturnInt = sqlite3_step(AStatementSqlite3_stmt);
            
            if (AExecuteSQLReturnInt == SQLITE_ERROR)
            {
                AErrorString = [[NSString alloc] initWithFormat:@"Drop Table failed!"];
                [self SetErrorString:AErrorString];
                [AErrorString release];
                AIsSuccessedBool = NO;
            }
            else {
                [self SetErrorString:@"Drop Table Successed"];
                AIsSuccessedBool = YES;
            }
        }
        //释放sqlite3_stmt 
        sqlite3_finalize(AStatementSqlite3_stmt);
        //关闭数据库
        sqlite3_close(FDatabaseSqlite);
    }
    return AIsSuccessedBool;
}

@end

 

使用代码:

#import <Foundation/Foundation.h>
#import "SqlService/SQLService.h"
@interface OperatingTheCartTable : NSObject
{

}
/*Cart 表字段
 Id
 ProductId 产品ID 
 ProductName  产品名臣
 Price  价格
 Quantity 数量
 ProductColor  产品颜色
 ProductSize 产品尺寸
 ProductSellAttributeId 产品销售属性ID
 */
+(NSInteger)GetNumberOfProduct;
+(BOOL)CreateCartTable;
+(NSMutableArray *)SelectFromCartTable;
+(NSMutableArray *)SelectFromCartTableWith:(NSInteger)AProductIdInteger;
+(BOOL)DeleteFromCartTable:(NSInteger)AIDInteger ProductSellAttributeId:(NSInteger)AProductSellAttributeIdInteger;
+(BOOL)InsertIntoCartTable:(NSInteger )AProductIdInteger ProductName:(NSString *)ANameString Price:(float )APriceFloat Quantity:(NSInteger)AQuantity ProductColor:(NSString *)AProductColor ProductSize:(NSString *)AProductSize ProductSellAttributeId:(NSInteger)AProductSellAttributeIdInteger;
+(BOOL)UpdateTheNumberOfCart:(NSInteger)AIDInteger Quantity:(NSInteger)AQuantityInteger ProductColor:(NSString *)AProductColor ProductSize:(NSString *)AProductSize ProductSellAttributeId:(NSInteger)AProductSellAttributeIdInteger;

 

#import "OperatingTheCartDatabase.h"

#define kLibrary [NSHomeDirectory() stringByAppendingPathComponent:@"Library"]
#define KDataBaseName @"Cart.sqlite"
@implementation OperatingTheCartTable


#pragma mark - 表 Cart
+(NSInteger)GetNumberOfProduct
{
    NSInteger ACountInteger=0;
    SQLService *ASQLService=[[[SQLService alloc] init] autorelease];
    NSString *ASelectString=[NSString stringWithFormat:@"select count(*) from Cart"];
    
    [ASQLService SelectData:ASelectString];
    NSMutableArray *AMutableArray=[ASQLService GetSQLExecutioResultsMutableArray];
    if(AMutableArray.count <= 0)
    {
        return  0;
    }
    ACountInteger = [[AMutableArray objectAtIndex:0] integerValue];
    return ACountInteger;
}

//ProductSellAttributeId
+(BOOL)CreateCartTable
{
    SQLService *ASQLService=[[SQLService alloc] init];
    NSString *ACreateBOOKSetingTable=[NSString stringWithFormat:@"create table if not exists Cart(Id INTEGER PRIMARY KEY autoincrement,ProductId INTEGER,ProductName nvarchar(250),Price float,Quantity INTEGER,ProductColor nvarchar(250),ProductSize nvarchar(250),ProductSellAttributeId INTEGER)"];
    if(![ASQLService CreateTable:ACreateBOOKSetingTable])
    {
        NSLog(@"创建表失败%@",[ASQLService GetErrorString]);
        [ASQLService release];
        return NO;
    }
    [ASQLService release];
    return YES;
}



+(NSMutableArray *)SelectFromCartTable
{
    SQLService *ASQLService=[[[SQLService alloc] init] autorelease];
    NSString *ASelectString=[NSString stringWithFormat:@"select * from Cart order by Id DESC"];
    
    [ASQLService SelectAllData:ASelectString];
    NSMutableArray *AMutableArray=[ASQLService GetSQLExecutioResultsMutableArray];
    for (int i=0; i<AMutableArray.count; i++) {
        NSMutableDictionary *AMutableDictionary=[[NSMutableDictionary alloc] initWithCapacity:1];
        NSMutableArray *ATempMutableArray=[AMutableArray objectAtIndex:i];
        
        [AMutableDictionary setValue:[ATempMutableArray objectAtIndex:1]forKey:@"ProductId"];
        [AMutableDictionary setValue:[ATempMutableArray objectAtIndex:2]forKey:@"ProductName"];
        [AMutableDictionary setValue:[ATempMutableArray objectAtIndex:3]forKey:@"Price"];
        [AMutableDictionary setValue:[ATempMutableArray objectAtIndex:4]forKey:@"Quantity"];
        if ([ATempMutableArray count] >= 6)
            [AMutableDictionary setValue:[ATempMutableArray objectAtIndex:5]forKey:@"ProductColor"];
        if ([ATempMutableArray count] >= 7)
           [AMutableDictionary setValue:[ATempMutableArray objectAtIndex:6]forKey:@"ProductSize"];
        if ([ATempMutableArray count] >= 8)
            [AMutableDictionary setValue:[ATempMutableArray objectAtIndex:7]forKey:@"ProductSellAttributeId"];
        
        [AMutableArray replaceObjectAtIndex:i withObject:AMutableDictionary];
      
        [AMutableDictionary release];
    }

    return AMutableArray;
}

//2013-10-31 11:41:57.457 CloudWork[2565:1a903] 红色,39,281
//2013-10-31 11:41:57.457 CloudWork[2565:1a903] 红色,37,278

+(NSMutableArray *)SelectFromCartTableWith:(NSInteger)AProductIdInteger
{
    SQLService *ASQLService=[[[SQLService alloc] init] autorelease];
    NSString *ASelectString=[NSString stringWithFormat:@"select * from Cart where ProductId=%d order by Id desc",AProductIdInteger];
    [ASQLService SelectAllData:ASelectString];
    NSMutableArray *AMutableArray=[ASQLService GetSQLExecutioResultsMutableArray];
    for (int i=0; i<AMutableArray.count; i++) {
        NSMutableDictionary *AMutableDictionary=[[NSMutableDictionary alloc] initWithCapacity:1];
        NSMutableArray *ATempMutableArray=[AMutableArray objectAtIndex:i];
        
        [AMutableDictionary setValue:[ATempMutableArray objectAtIndex:1]forKey:@"ProductId"];
        [AMutableDictionary setValue:[ATempMutableArray objectAtIndex:2]forKey:@"ProductName"];
        [AMutableDictionary setValue:[ATempMutableArray objectAtIndex:3]forKey:@"Price"];
        [AMutableDictionary setValue:[ATempMutableArray objectAtIndex:4]forKey:@"Quantity"];
        if ([ATempMutableArray count] >= 6)
            [AMutableDictionary setValue:[ATempMutableArray objectAtIndex:5]forKey:@"ProductColor"];
        if ([ATempMutableArray count] >= 7)
            [AMutableDictionary setValue:[ATempMutableArray objectAtIndex:6]forKey:@"ProductSize"];
        if ([ATempMutableArray count] >= 8)
            [AMutableDictionary setValue:[ATempMutableArray objectAtIndex:7]forKey:@"ProductSellAttributeId"];
        
        [AMutableArray replaceObjectAtIndex:i withObject:AMutableDictionary];
                  NSLog(@",%@,%@,%@,%@",[AMutableDictionary valueForKey:@"Quantity"],[AMutableDictionary valueForKey:@"ProductColor"],[AMutableDictionary valueForKey:@"ProductSize"],[AMutableDictionary valueForKey:@"ProductSellAttributeId"]);
        [AMutableDictionary release];
    }
    
    return AMutableArray;
    
}


+(BOOL)DeleteFromCartTable:(NSInteger)AIDInteger ProductSellAttributeId:(NSInteger)AProductSellAttributeIdInteger
{
    BOOL ABOOL=NO;
    NSString *ADeleteString=[NSString stringWithFormat:@"delete from Cart where ProductId=%d and ProductSellAttributeId=%d",AIDInteger,AProductSellAttributeIdInteger];
    SQLService *ASQLService=[[SQLService alloc] init];
    if([ASQLService DeleteData:ADeleteString])
    {
        ABOOL=YES;
    }
    else {
        ABOOL=NO;
    }
    [ASQLService release];
    return ABOOL;
}
+(BOOL)InsertIntoCartTable:(NSInteger )AProductIdInteger ProductName:(NSString *)ANameString Price:(float )APriceFloat Quantity:(NSInteger)AQuantity ProductColor:(NSString *)AProductColor ProductSize:(NSString *)AProductSize ProductSellAttributeId:(NSInteger)AProductSellAttributeIdInteger
{
    BOOL ABOOL=NO;
    NSString *AInsertString=[NSString stringWithFormat:@"insert into Cart(ProductId,ProductName,Price,Quantity,ProductColor,ProductSize,ProductSellAttributeId) values(%d,‘%@‘,%f,%d,‘%@‘,‘%@‘,%d)",AProductIdInteger,ANameString,APriceFloat,AQuantity,AProductColor,AProductSize,AProductSellAttributeIdInteger];
    SQLService *ASQLService=[[SQLService alloc] init];
    if([ASQLService InsertData:AInsertString])
    {
        ABOOL=YES;
    }
    else {
        ABOOL=NO;
    }
    [ASQLService release];
    return ABOOL;
}
+(BOOL)UpdateTheNumberOfCart:(NSInteger)AIDInteger Quantity:(NSInteger)AQuantityInteger ProductColor:(NSString *)AProductColor ProductSize:(NSString *)AProductSize ProductSellAttributeId:(NSInteger)AProductSellAttributeIdInteger
{
    BOOL ABOOL=NO;
    NSString *AUpdateString=[NSString stringWithFormat:@"update Cart set Quantity=%d,ProductColor=‘%@‘,ProductSize=‘%@‘ where ProductId=%d and ProductSellAttributeId=%d",AQuantityInteger,AProductColor,AProductSize,AIDInteger,AProductSellAttributeIdInteger];
    SQLService *ASQLService=[[SQLService alloc] init];
    
    if ([ASQLService UpdateData:AUpdateString]) {
        ABOOL=YES;
    }
    else {
        ABOOL=NO;
    }
    [ASQLService release];
    return ABOOL;
}
@end

 

第六十六篇、OC_Sqlite数据库操作