7

Objective-C のオブジェクトにマップしようとしている sqlite3 テーブルがあります。テーブルの 1 つの属性は、DATETIME として格納される「completed_at」です。

'completed_at' 属性に適切にマップされる私の目標 C クラス (NSObject から継承) にプロパティを作成したいと考えています。

Objective-C には NSDate 型がありますが、それが直接マップされるかどうかはわかりませんか?

4

4 に答える 4

27

ここでは、プレゼンテーション用のデータを保存および取得するための日付の書式設定に関する重要な点のみを共有しています。このコード スニペットに問題がある場合は、プロジェクトで使用した完全なコードを共有します。

データを保存するときは、次のように SQL ステートメントで日付値をバインドします。

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString *dateString=[dateFormat stringFromDate:[NSDate date]];

    sqlite3_bind_text(saveStmt, 1, [dateString UTF8String] , -1, SQLITE_TRANSIENT);

データを取得するときは、次のコードを記述する必要があります。

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate *myDate =[dateFormat dateFromString:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)]];

これで、独自の方法でレンダリングできる NSDate 型の変数 myDate ができました。

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"dd-MM-yyyy hh:mm:ss a"];
    NSLog(@"My Date was : %@", [formatter stringFromDate:myDate]);

次の 3 つのことを覚えておく必要があります。

  1. SQLite の日付フィールド タイプは DATETIME である必要があります
  2. 保存時と取得時の日付形式は同じにする必要があります
  3. これで、独自の方法で表示できますが、フォーマットに従います。フォーマットの詳細の下に記載されています。

フォーマット:

   'dd' = Day 01-31
   'MM' = Month 01-12
   'yyyy' = Year 2000
   'HH' = Hour in 24 hour
   'hh' = Hour in 12 hour
   'mm' = Minute 00-59
   'ss' = Second 00-59
   'a' = AM / PM
于 2011-08-18T13:57:33.807 に答える
3

Objective-C の経験はありませんが、Google 検索でApple のNSDate Class Referenceを見つけました。リンクされたページで提供されている情報を使用すると、Objective-C で 32 ビットのエポック時間を操作する方法を理解できるはずです。これは SQLite でうまく機能します。おそらく、32 ビット時間のタイプ INTEGER として completed_at 列を作成します。

SQLite は実際には浮動小数点数であるユリウス日付を好みます。NSDate クラスを強制的にジュリアンと連携させる方法を説明するドキュメントは見つかりませんでした。

timeIntervalSince1970は非常に興味深いものに見えます。

于 2008-11-19T18:03:54.877 に答える
2

これは数週間前に出てきました:

iPhoneアプリケーションでSQLite3に日付を永続化する

于 2008-11-19T22:06:16.070 に答える
2

プレゼンテーションに影響を与えようとしている場合、フォーマッタは重要ですが、内部ストレージに if を使用すると、計算、比較、ソートなどに値を使用する DB エンジンの機能を無効にする可能性のある文字列を定義することになります。日付値をDBに挿入するさまざまなクライアントが必要になるため、どこにでも変換関数を記述する必要があります。私は以下を使用しましたが、期待どおりに機能しました(DATETIMEとして定義されたスキーマの列):

dateExpires = [NSDate dateWithTimeIntervalSinceNow: sqlite3_column_double(queryStmt, 5)];

ここでは、中部時間帯の「2010 年 4 月 12 日」として、Firefox アドオンを使用して SQLITE3 データベースに挿入しました。XCode-debugger で「dateExpires」の値を表示すると、次のように表示されます。

2010-04-12 23:19:48 -0500

案の定、それが正しい時間です。

また、SQLITE DB に挿入するには、値を入力します[NSDate date]

于 2010-04-13T04:30:22.513 に答える