Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 为什么列的最大值永远不等于或大于10?_Iphone_Ios_Objective C_Sqlite - Fatal编程技术网

Iphone 为什么列的最大值永远不等于或大于10?

Iphone 为什么列的最大值永远不等于或大于10?,iphone,ios,objective-c,sqlite,Iphone,Ios,Objective C,Sqlite,在我的应用程序中,表名是dataset\u master。 这个表的字段名是dataset_id,我想得到这个字段的最大值,所以我用代码进行如下查询 -(NSString *) getLastRowFromDataset_masterTableByProjectID:(NSString *) project_id { NSString *dataset_id = @""; sqlite3_stmt *statement = NULL; NSString *query =

在我的应用程序中,表名是dataset\u master。 这个表的字段名是dataset_id,我想得到这个字段的最大值,所以我用代码进行如下查询

-(NSString *) getLastRowFromDataset_masterTableByProjectID:(NSString *) project_id
{
    NSString *dataset_id = @"";
    sqlite3_stmt *statement = NULL;
    NSString *query = [NSString stringWithFormat:@"SELECT MAX(dataset_id) FROM dataset_master where project_id = ?;"];

    if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil) == SQLITE_OK)
    {
        sqlite3_bind_text(statement, 1, [project_id UTF8String], -1, SQLITE_TRANSIENT);

        while (sqlite3_step(statement) == SQLITE_ROW)
        {
            char *datasetIDChars = (char *) sqlite3_column_text(statement, 0);

            if(datasetIDChars != NULL)
                dataset_id  = [[NSString alloc] initWithUTF8String:datasetIDChars];

        }
    }

    return dataset_id;
}
这里我需要项目id,因为我需要基于项目id获取数据集id

一切都很好,但当数据集_id为10或大于10时,我无法得到适当的最大值,我的意思是每次我得到9


我不知道什么是真正的问题,我只是简单的fire查询,但我无法得到正确的答案。

如果是文本字段,9将大于10。对于id字段,应该使用整数来获得良好的比较

然后,您可以通过以下方式检索它:

NSNumber *id = [NSNumber numberWithLongLong:sqlite_column_int64(statement, i)];
选择时,请使用整数列而不是文本。更好的是,您可以定义列整数主键,它将返回表的rowid。更多内容可以阅读。因为它是rowid的别名,所以在插入数据时不需要指定值——它将获得下一个最高的id

如果不希望此列是唯一id,则只需将该列定义为整数,并在插入时提供一个值


最后,如果你想获得最大ID,请考虑插入后使用。它将从rowid返回最后一个id。

使用以下查询,但请注意,这是一个成本有点高的调用:

否则

将dataset_id的数据类型更改为整数应该可以解决您的问题

对于Ranju Patel的查询:

为什么MAX函数不能与文本数据类型一起使用? 对于文本数据类型,排序顺序为ASCII排序顺序

其中9>10,09<10,[Ref:http://en.wikipedia.org/wiki/ASCIIOrder],因此,如果存储的数据为9,10,则MAX函数将不起作用

另一方面,

如果数据sotred为09、10,并且您的查询为:

NSString *query = [NSString stringWithFormat:@"SELECT MAX(dataset_id) FROM dataset_master where project_id = ?;"];
你得到的结果是10

我的回答会长期有效吗?
如果您没有太多的数据,它会起作用,否则会减慢您的速度,因此我提到了它:在原始选择查询中调用CAST函数的成本非常高。

这是sqlite吗?您从sqlite命令行中得到了什么?什么代码正在执行此操作?是的,它的SQlLite,,我无法得到任何错误消息。您从sqlite命令行中得到了什么?包含调用该查询的代码。@bryanmac-检查我的完整代码方法:您必须使用varchar字段。相反,要么将其转换为整数,要么在max Function内执行强制转换请详细说明您的答案,我无法获得它,因为我是iOS开发的新手。。我的数据集id是“文本”,所以我需要更改什么?这里我的数据集id不是auto_inc.而是简单的字段。。然后我还需要应用“integer”而不是TEXT?但是sqlite3\u last\u insert\u rowid它将从整个数据库返回最后插入的行id,但我只需要从表而不是整个数据库中获取它。它听起来像一个id,所以我建议使用integer主键。如果它不是唯一的id,那么定义为整数并分配给自己。但是你会失去像last insert rowid函数和auto assign这样的功能…对于last row id,这就是为什么我说在插入之后使用它。如果这不是你的情况,那么选择max也会起作用。哇,这对我来说很有效。谢谢你的帮助。。但是你可以解释为什么它不适用于文本数据类型,你确定你的答案在很长一段时间内都不错吗??再次感谢:这是一个解决实际问题的方法。真正的问题是id应该是int。它通过将每个字符串强制转换为int@query time来解决这个问题。这对于存储、索引等来说是无效的。。。将存储设置为int并保存施法等…bryanmac,我同意你的观点,这就是为什么我提到了这样做的成本。我也同意你的观点,id字段应该是integer类型。@SushmaSatish-谢谢你详细说明你的答案:但是如果数据是09,10,而你的查询是:……你得到的结果是10。。。但是每次我得到的是9而不是10,那么为什么我之前的查询能够正确地处理1到9的“数据集\ id”?而不是当我的数据集id为10或大于10时?
NSString *query = [NSString stringWithFormat:@"SELECT MAX(dataset_id) FROM dataset_master where project_id = ?;"];