打印时主键为空,并且结果被检索但打印时它的ID仍空

问题描述 投票:0回答:1

用户ID为null,该列是主键,它不应该是可能有它为空

我正在学习扑动和SQFlite,我下面在Udemey过程中的例子,我打字它的信,但它的工作对教师和它的工作不适合我

我简化了一切,现在它的一个文件,但是,ID为空

main.dart

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';

void main() async {
//  debugPrint("Hello World");
  var db = dbhelp();
  User user1 = User("User1");
  int insertResult = await db.saveUser(user1);
  debugPrint("insert result is " + insertResult.toString());
  User searchResult = await db.retrieveUser(insertResult);
  debugPrint(searchResult.toString());
}

class dbhelp {
  static final dbhelp _instance = dbhelp.internal();
  dbhelp.internal();
  factory dbhelp() => _instance;
  static Database _db;
  void _onCreate(Database _db, int newVersion) async {
    await _db.execute(
        "CREATE TABLE MYTABLE(ID INTEGER PRIMARY KEY, userName TEXT NOT NULL)");
  }

  Future<Database> initDB() async {
    Directory documentDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentDirectory.path, "appdb.db");
    Database newDB = await openDatabase(path, version: 1, onCreate: _onCreate);
    return newDB;
  }

  Future<Database> get db async {
    if (_db != null) {
      return _db;
    } else {
      _db = await initDB();
      return _db;
    }
  }

  Future<int> saveUser(User user) async {
    var dbClient = await db;
    int result;
    var userMap = user.toMap();
    result = await dbClient.insert("MYTABLE", userMap);
    return result;
  }

  Future<User> retrieveUser(int id) async {
    var dbClient = await db;
    if (id == null) {
      print("The ID is null, cannot find user with Id null");
      var nullResult =
          await dbClient.rawQuery("SELECT * FROM MYTABLE WHERE ID is null");
      return User.fromMap(nullResult.first);
    }
    String sql = "SELECT * FROM MYTABLE WHERE ID = $id";
    var result = await dbClient.rawQuery(sql);
    if (result.length != 0) {
      return User.fromMap(result.first);
    } else {
      return null;
    }
  }
}

class User {
  String _userName;
  int _id;
  String get userName => _userName;
  int get id => _id;
  User(this._userName, [this._id]);
  User.map(dynamic obj) {
    this._userName = obj['userName'];
    this._id = obj['id'];
  }
  User.fromMap(Map<String, dynamic> map) {
    this._userName = map["userName"];
    if (map["id"] != null) {
      this._id = map["id"];
    } else {
      print("in fromMap, Id is null");
    }
  }
  Map<String, dynamic> toMap() {
    Map map = Map<String, dynamic>();
    map["userName"] = this._userName;
    if (_id != null) {
      map["id"] = _id;
    } else {
      print("in toMap, id is null");
    }
    return map;
  }

  @override
  String toString() {
    return "ID is ${this._id} , Username is ${this._userName} }";
  }
}

当我打印ID应该打印数量不为空

但它始终是空

flutter sqflite
1个回答
0
投票

我很困惑了一段时间。后您选择一个简单的打印显示的问题:

String sql = "SELECT * FROM MYTABLE WHERE ID = $id";
var result = await dbClient.rawQuery(sql);
print(result);

输出:

[{ID: 1, userName: User1}]

列名是区分sensitive.You有时用id(在toMap / fromMap),有时ID(在创建表)。确保处处总是使用相同的名称。

© www.soinside.com 2019 - 2024. All rights reserved.