微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DART 如何将 DATETIME 映射到 SQFlite 数据库

如何解决DART 如何将 DATETIME 映射到 SQFlite 数据库

概述:

应用架构详情:

  • 状态管理 -> provider(不确定这是否相关,但如果您有兴趣)
  • 数据存储 -> SQFlite

具体问题详情:

我有一个 calendarDay 数据模型,其属性

  DateTime date;

我知道 sqlite 不支持 DateTime(SQFlite不支持),the recommendation 将使用 StringInteger 。我正在为如何真正做到这一点而苦苦挣扎。

我遇到的错误

颤动:***警告*** 类型为 DateTime 的无效参数 2021-07-01 15:09:11.129598。 仅支持 num、String 和 Uint8List。详情见https://github.com/tekartik/sqflite/blob/master/sqflite/doc/supported_types.md 这将在未来抛出异常。目前,每种类型只显示一次。

这是我的设置:

calendar_day.dart

 class CalendarDay {
  int? id;
  DateTime date; 

   CalendarDay(
       {this.id,required this.date});

    // encode to sqlite database

     Map<String,dynamic> toMap() {
     final map = Map<String,dynamic>();
     map['id'] = id;
     map['date'] = date.toIso8601String(); //toString(); this toString did not work //jsonEncode(date) -> SERIALIZE THE ARRAYS INTO JSON strings,this did not work
      return map;
       }

     // decode from sqlite database

       static fromMap(Map map) {
        return CalendarDay(
         id: map['id'],date: DateTime.parse(map['date']),// jsonDecode(map['date']));
      }

     }

database_client.dart

   class DatabaseClient {
     Future<Database> initializedDatabase() async {
     WidgetsFlutterBinding.ensureInitialized();
    String path = await getDatabasesPath();
     return openDatabase(
      join(path,'three_things_database.db'),onCreate: (database,version) async {
        
    await database.execute(
      "CREATE TABLE ${Strings.calendarDayDataBase} (id INTEGER PRIMARY KEY,date TEXT)",); },version: 1,); }

     // Create / insert calendarDay
      Future<void> insertCalendarDay(CalendarDay day) async {
      final Database database = await initializedDatabase();
      await database.insert(
      Strings.calendarDayDataBase,day.toMap(),conflictAlgorithm: ConflictAlgorithm.replace,);
      }
    }

我认为问题出在 toMap() 方法上,因为错误记录了 DateTime 对象。但我有点卡住了,真的不知道如何解决这个问题。非常感谢任何帮助。

我在 toMap() 中尝试的其他内容

我确实包含了注释掉的代码,但为了清楚起见,我会在这里发布:

  • 我尝试将 DateTime 对象映射到 JSONString。这有望足以将地图存储在 sqlite 数据库中,但这种方法会引发相同的错误

  • 尝试使用 date.toString() 映射到常规字符串。这也不起作用。由于 SQFlite 人员的建议(上面的链接)是使用 ISO8601 字符串,我认为这种方法会奏效。

相关问题,但没有解决我的问题:

解决方法

这是一个明显的例子:

var dt = DateTime.now();

// String
var dtStr = dt.toIso8601String();
dt = DateTime.tryParse(dtStr);
    
// Int
var dtInt = dt.millisecondsSinceEpoch;
dt = DateTime.fromMillisecondsSinceEpoch(dtInt);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。