【问题标题】:Saving Date to SQLite将日期保存到 SQLite
【发布时间】:2015-02-04 06:30:36
【问题描述】:
-(void)save:(id)sender
{
sqlite3_stmt *statement;
const char *dbpath = [databasePath UTF8String];

if (sqlite3_open(dbpath, &expenseDB) == SQLITE_OK)
{

    NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO ADDEXPENSE(date, description, category, amount) VALUES (\"%@\", \"%@\", \"%@\",\"%@\")", fieldOne.text, fieldTwo.text,fieldThree.text , fieldFour.text];

    const char *insert_stmt = [insertSQL UTF8String];

    sqlite3_prepare_v2(expenseDB, insert_stmt, -1, &statement, NULL);
    if (sqlite3_step(statement) == SQLITE_DONE)
    {
      status.text = @"saved"
    } 
    else 
    {
       status.text = @"Failed"
    }
    sqlite3_finalize(statement);
    sqlite3_close(expenseDB);
}
}

这个方法对我来说很好用。但是如何将它保存为日期而不是字符串? 我尝试了几种方法,但对我没有用。 因为我是编码新手。有人请帮我写一段代码 u u u u u u u u 这是我使用的日期选择器。

UIDatePicker *picker = (UIDatePicker *)sender;
NSDate *dateSelected = [picker date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd.MM.yyyy"];
self.fieldOne.text = [dateFormatter stringFromDate:dateSelected];

【问题讨论】:

标签: iphone ios xcode sqlite


【解决方案1】:

SQLLite 没有日期数据类型,因此您必须将其保存为文本或数字。我个人使用 text 方法,我的代码在插入或更新时将任何日期转换为文本,并在选择时将其转换回。

所以从我使用的日期开始

[self.dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"];
NSString *dateString = [self.dateFormatter stringFromDate:date];

转换回来

[self.dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"];
NSDate *theDate = [self.dateFormatter dateFromString:ds];

我将值保留为日期,直到我想要显示它为止。

您的代码示例需要一些思考,因为 iOS 开发中的关键概念之一是 MVC,这意味着您应该尝试将视图与模型分开。理想情况下,您应该有一个对象,其中存储了数据。您的 View 知道如何显示数据,您的 Model 知道如何存储和检索数据。

值得研究,因为它使代码更易于维护和扩展。

【讨论】:

  • 如果你这样做,我建议明确设置日期格式化程序以使用[NSTimeZone timeZoneForSecondsFromGMT:0];timeZone[NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]locale,如Technical Q&A 1480 中所述,虽然它正在讨论“互联网日期”同样适用于在数据库中存储日期。
【解决方案2】:

最好在数据库中创建一个双精度数据类型的字段,并使用 [NSDate timeinterversince1970] 将日期保存在时间戳中;这将使 NSDate 成为时间戳,您可以将其以双格式保存在数据库中,同时使用 NSDate 类中类似类型的函数将时间戳转换为 NSDate。

【讨论】:

    【解决方案3】:

    【讨论】:

    • 那是我从中获得此代码的站点。该站点中没有任何日期。
    【解决方案4】:

    通常日期值被存储为字符串。但是除了日期之外,很少有方法可以让开发人员存储日期值。

    以下是可以让您了解相同内容的参考资料。

    1. Persisting Dates to SQLite3 in an iPhone Application

    2. Objective-C and sqlite's DATETIME type

    【讨论】:

      【解决方案5】:

      将日期添加到 sqlite 数据库表的代码:


      -(void) saveData
      
      
      
      {
      
      
      
      sqlite3_stmt *statement = NULL;
      
      const char *dbpath = [databasePath UTF8String];
      sqlite3_reset(statement);
      
      if (sqlite3_open(dbpath, &recordsDB) == SQLITE_OK)
      
      {
      
      
      
      NSString* Date = [NSDate dateWithTimeIntervalSinceNow : sqlite3_column_double(statement, 0)];
      
      
          NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO RECORDS Date VALUES ( \"%@\")",Date];
      
      
          NSLog(@"save Data %@",Date);
          NSLog(@"save Data %@",insertSQL);  //to print the values inserted in the database
      
      
      
          const char *insert_stmt = [insertSQL UTF8String];
      
          sqlite3_prepare_v2(recordsDB, insert_stmt, -1, &statement, NULL);
      
      
          if (sqlite3_step(statement) == SQLITE_DONE)
          {
      
                 NSLog(@"@database created");
      
              NSLog(@"databasevalue:%@",insertSQL);
      
      
          } else
          {
              NSLog(@"@database not created");
          }
      
          sqlite3_finalize(statement);
      
      
          sqlite3_close(recordsDB);
      
      }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-03
        • 1970-01-01
        • 2015-06-21
        • 2017-10-26
        • 2022-01-23
        相关资源
        最近更新 更多