gpt4 book ai didi

ios - 问题相关的sqlite从数据库IOS中获取日期之间的日期

转载 作者:行者123 更新时间:2023-12-02 05:24:02 25 4
gpt4 key购买 nike

就在它完美工作之前的几分钟,突然不知道发生了什么,没有改变任何东西,但它不再工作了,尝试了很多,但无法弄清楚我错过了什么,对我来说就像天堂一样,下面是我的代码

这就是我的 sqlite 数据库中的日期 1978年1月20日

       01/20/2013

02/28/1979


MM/dd/yyyy


NSLog(@"Fetching holidays from the database between %@ and %@...", fromDate, toDate);
// fromdate and todate both are nsdate this is what they prints
// Fetching holidays from the database between 2013-06-29 18:30:00 +0000 and 2013-08-03 18:29:59 +0000...
NSDateFormatter *fmt = [[[NSDateFormatter alloc] init] autorelease];



NSString *query4 = [[NSString alloc] initWithFormat:@"select Birthdates,Names,Profilepic,Email,Phonenumber from PersonNamesAndBirthDates where Birthdates between ? and ?"];


sqlite3_stmt *stmt4;
int x4 = sqlite3_prepare_v2(database1,[query4 UTF8String],-1, &stmt4, nil);
if (x4 == SQLITE_OK)
[fmt setDateFormat:@"MM/dd/yyyy"];

sqlite3_bind_text(stmt4, 1, [[fmt stringFromDate:fromDate] UTF8String], -1, SQLITE_STATIC);
sqlite3_bind_text(stmt4, 2, [[fmt stringFromDate:toDate] UTF8String], -1, SQLITE_STATIC);
//**IT WAS GOING IN WHILE BUT NOW ITS NOT GOING IN SO IT JUST JUMP FROM HERE**
while(sqlite3_step(stmt4) == SQLITE_ROW)
{
NSString *name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt4, 0)];
NSString *proPic = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt4, 1)];
NSString *email = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt4, 2)];
NSString *pNumber = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt4, 3)];
NSString *bDate = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt4, 4)];


[holidays addObject:[Holiday holidayNamed:name email:email profilePic:proPic phoneNumber:pNumber date:[fmt dateFromString:bDate]]];


NSLog(@"%@",holidays);

}
sqlite3_finalize(stmt4);
NSLog(@"%@",holidays);

sqlite3_close(database1);
[delegate loadedDataSource:self];

}

最佳答案

格式化程序与您在数据库中使用的内容相匹配,但问题是该格式不会按时间顺序对日期进行排序。 SQLite 没有正确的日期数据类型,而是将日期存储为字符串(也可以是数字,但不是真正的“日期”数据类型)。更糟糕的是,因为您当前的字符串值的格式为 MM/dd/yyyy ,因此它将按字母顺序对它们进行排序,即按月,然后按日,然后按年,而不是按时间顺序。

解决办法是:

  • 检查数据库并替换日期值,当前以 MM/dd/yyyy 格式存储为字符串。 ,字符串值的格式为 yyyy-MM-dd

  • 同样,在上面的代码示例中,替换:

    [fmt setDateFormat:@"MM/dd/yyyy"];

    [fmt setDateFormat:@"yyyy-MM-dd"];

您还可以使用 Date And Time Functions 中列举的格式之一。但是选择一种格式,以便当您按字母顺序对其进行排序时,它也可以有效地按时间顺序对其进行排序。

<小时/>

虽然您确实应该修复数据库中的数据,但您可以定义一个自定义 SQLite 函数,该函数可以从 MM/dd/yyyy 进行转换至yyyy-MM-dd在飞行中。所以,在你的@implementation之前,声明这个新函数:

void convertFromMMDDYYYY(sqlite3_context *context, int argc, sqlite3_value **argv);

然后,在@end之后您的@implementation ,实现该功能:

/*
convert from MM/dd/yyyy
to yyyy-MM-dd
*/
void convertFromMMDDYYYY(sqlite3_context *context, int argc, sqlite3_value **argv)
{
assert(argc == 1);

if (sqlite3_value_type(argv[0]) != SQLITE_TEXT) {
sqlite3_result_null(context);
return;
}

NSString *originalDateString = [NSString stringWithUTF8String:(const char *)sqlite3_value_text(argv[0])];

static NSDateFormatter *mmddyyyyFormat = nil;
static NSDateFormatter *yyyymmddFormat = nil;

// date formatters are a little computationally intensive to create, so let's only do it once

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
mmddyyyyFormat = [[NSDateFormatter alloc] init];
mmddyyyyFormat.dateFormat = @"MM/dd/yyyy";

yyyymmddFormat = [[NSDateFormatter alloc] init];
yyyymmddFormat.dateFormat = @"yyyy-MM-dd";
});

NSDate *date = [mmddyyyyFormat dateFromString:originalDateString];
if (date == nil)
{
sqlite3_result_null(context);
return;
}

NSString *resultingDateString = [yyyymmddFormat stringFromDate:date];
char *buf = sqlite3_malloc(sizeof(char) * [resultingDateString length] + 1);
strcpy(buf, [resultingDateString UTF8String]);

sqlite3_result_text(context, buf, -1, sqlite3_free);
}

现在,当您的应用程序打开数据库时,定义一个 SQLite 函数 YYYYMMDD ,这将调用上面的例程:

if (sqlite3_create_function_v2(database1, "YYYYMMDD", 1, SQLITE_ANY, NULL, &convertFromMMDDYYYY, NULL, NULL, NULL) != SQLITE_OK)
NSLog(@"%s: sqlite3_create_function_v2 error: %s", __FUNCTION__, sqlite3_errmsg(database1));

然后您可以更改 SQL 以利用这个新的 SQLite 函数:

NSString *query4 = @"select Birthdates,Names,Profilepic,Email,Phonenumber from PersonNamesAndBirthDates where YYYYMMDD(Birthdates) between ? and ?";

当然,因为这是在寻找 yyyy-MM-dd格式,您应该使用该格式为 WHERE 绑定(bind)的值此特定 SQL 语句中的子句:

sqlite3_stmt *stmt4;
int x4 = sqlite3_prepare_v2(database1,[query4 UTF8String],-1, &stmt4, nil);
if (x4 == SQLITE_OK) {
[fmt setDateFormat:@"yyyy-MM-dd"];

// ...
}

同样,最好修复数据,但您可以使用此自定义函数方法。这是一种非常低效的方法,但应该可行。

关于ios - 问题相关的sqlite从数据库IOS中获取日期之间的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17723624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com