Iphone 计数(*)为EXC\u提供了错误的访问权限

Iphone 计数(*)为EXC\u提供了错误的访问权限,iphone,objective-c,ios,sqlite,Iphone,Objective C,Ios,Sqlite,在使用SELECT语句执行SQLITE并使用COUNT(*)来计算该列的总数时,我可以使用EXC_BAD_访问。 它在将数组从一个数组添加到另一个数组时向我发送错误。不知道为什么会这样,但有没有人遇到过这样的问题可以帮忙解决 -(void) title{ self.array = [[[NSMutableArray alloc] init] autorelease]; const char *query_stmt = "SELECT DISTINCT ID, KEY, COUNT (*) F

在使用SELECT语句执行SQLITE并使用COUNT(*)来计算该列的总数时,我可以使用EXC_BAD_访问。 它在将数组从一个数组添加到另一个数组时向我发送错误。不知道为什么会这样,但有没有人遇到过这样的问题可以帮忙解决

-(void) title{

self.array = [[[NSMutableArray alloc] init] autorelease];
const char *query_stmt = "SELECT DISTINCT ID, KEY, COUNT (*)  FROM TEST GROUP BY KEY";
if (sqlite3_prepare_v2(database, query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
    while(sqlite3_step(statement) == SQLITE_ROW)
    {
        NSString *ID = [NSString stringWithUTF8String:(char *) sqlite3_column_text(exhProduct_statement, 0)];
        NSString *KEY = [NSString stringWithUTF8String:(char *) sqlite3_column_text(exhProduct_statement, 1)];
        NSUInteger taskCount=  sqlite3_column_int(exhProduct_statement, 2);
        NSMutableArray *taskArray=[[NSMutableArray alloc]initWithObjects:ID, KEY, taskCount,nil] ; <--- Error

        [self.array addObject:taskArray];
    }
    sqlite3_finalize(statement);        
}       
}
-(无效)标题{
self.array=[[NSMutableArray alloc]init]autorelease];
const char*query_stmt=“按键从测试组中选择不同的ID、键、计数(*)”;
if(sqlite3\u prepare\u v2(数据库、查询stmt、&statement、NULL)==SQLITE\u确定)
{
while(sqlite3\u步骤(语句)=SQLITE\u行)
{
NSString*ID=[NSString stringWithUTF8String:(char*)sqlite3_列_文本(exhProduct_语句,0)];
NSString*KEY=[NSString stringWithUTF8String:(char*)sqlite3_列_文本(exhProduct_语句,1)];
NSUInteger taskCount=sqlite3\u column\u int(exhProduct\u语句,2);

NSMutableArray*taskArray=[[NSMutableArray alloc]initWithObjects:ID,KEY,taskCount,nil];您需要将
NSInteger
更改为
NSNumber

    NSMutableArray *taskArray=[[NSMutableArray alloc]initWithObjects:ID, KEY, [NSNumber numberWithUnsignedInteger:taskCount],nil] ;
以后可以使用

    NSUInteger *retrievedTaskCount = [[taskArray objectAtIndex:2] unsignedIntegerValue];

这是因为
NSArray
存储
NSObject
s,因此,任何时候如果希望将
int
float
NSInteger
NSInteger
等存储在
NSArray
NSMutableArray
中,都需要将其转换为对象。
NSNumber>
就是为此而构建的类。

您需要将
NSUInteger
更改为
NSNumber

    NSMutableArray *taskArray=[[NSMutableArray alloc]initWithObjects:ID, KEY, [NSNumber numberWithUnsignedInteger:taskCount],nil] ;
以后可以使用

    NSUInteger *retrievedTaskCount = [[taskArray objectAtIndex:2] unsignedIntegerValue];

这是因为
NSArray
存储
NSObject
s,因此,任何时候如果希望将
int
float
NSInteger
NSInteger
等存储在
NSArray
NSMutableArray
中,都需要将其转换为对象。
NSNumber>
就是为此而构建的一个类。

sql正确吗?我想如果你想要一个不同id键组合的计数,你需要同时按键和id进行分组。只有受虐狂才会在Objective-C(SQLite包装器)或(对象图管理器)中直接使用SQLite C API相反。嗨,戴夫。谢谢你的帮助。但我已经准备好了我的应用程序,所以现在无法更改我的数据库。它并不是真的更改你的数据库,只是让它更容易与你交互(假设你使用FMDB)。sql正确吗?我认为如果您想要一个不同id键组合的计数,您需要同时按键和id进行分组。只有受虐狂才直接在Objective-C(SQLite包装器)或(对象图管理器)中使用SQLite C API相反。嗨,戴夫。谢谢你的帮助。但是我已经准备好了我的应用程序,所以现在无法更改我的数据库。这并不是真的更改你的数据库,只是让它更易于交互(假设你使用FMDB)。谢谢PengOne。我正在尝试提取CellForRowatineXpath中的值,我应该如何在NSNUmber=[[taskArray ObjectaIndex:2]中检索该值unsignedIntValue];是否正确?@lifemoveson:不完全正确。将其检索为
NSUInteger*taskCountBack=[[taskArray objectAtIndex:2]unsignedIntValue]不同之处在于,
NSNumber
是一个对象,用作
int
s、
float
s、
NSInteger
s、
NSInteger
s等的容器。因此,如果您想要一个值,请使用后4项中的一项。如果您想要一个对象(例如,将其放入数组中),然后使用
NSNumber
@Peng:非常感谢你的回答。但是我还有一个问题。你如何将NSUInteger与NSString连接起来?就像我的例子中的NSString*key和NSUInteger taskCount一样?@lifemoveson:这是一个不同的问题,可能应该单独问。简短的回答是使用
-stringWithFormat
@PengOne:谢谢。Its..NSString*value=[NSString stringWithFormat:@“%d”,taskCount];谢谢PengOne。我正在尝试提取cellForRowAtIndexPath中的值,我应该如何在NSNUmber=[[taskArray objectAtIndex:2]unsignedIntValue]中检索该值;正确吗?@lifemoveson:不正确。检索为
NSInteger*taskCountBack=[[taskArray objectAtIndex:2]unsignedIntValue];
不同之处在于
NSNumber
是一个对象,用作
int
s、
float
s、
NSInteger
s、
NSInteger
s等的容器。因此,如果需要值,请使用后4项中的一项。如果需要对象(例如,用于将其放入数组),然后使用
NSNumber
@Peng:非常感谢你的回答。但是我还有一个问题。你如何将NSUInteger与NSString连接起来?就像我的例子中的NSString*key和NSUInteger taskCount一样?@lifemoveson:这是一个不同的问题,可能应该单独问。简短的回答是使用
-stringWithFormat
@PengOne:谢谢。Its..NSString*值=[NSString stringWithFormat:@“%d”,taskCount];