1

I've already read the related article and solution + mentioned method, but still I don't get it what should I add to my code for importing csv to sqlite table List<<Map<String, dynamic>. I need to replace existing table with a new one and insert each lines of converted csv. How can I solve it? Here's my code below.The problem is importVoca() of db.dart.

db.dart

class DBHelper {
  var _db;

// create database
  Future<Database> get database async {
    if (_db != null) return _db;
    _db = openDatabase(
      join(await getDatabasesPath(), 'vocas.db'),
      onCreate: (db, version) {
        return db.execute(
          "CREATE TABLE vocas(id TEXT PRIMARY KEY, word TEXT, meaning TEXT, createTime TEXT)",
        );
      },
      version: 1,
    );
    return _db;
  }

// insert voca
  Future<void> insertVoca(Voca voca) async {
    final db = await database;
    await db.insert('vocas', voca.toMap(),
        conflictAlgorithm: ConflictAlgorithm.replace);
  }

// Voca list
  Future<List<Voca>> vocas() async {
    final db = await database;
    final List<Map<String, dynamic>> maps = await db.query('vocas');

    return List.generate(maps.length, (i) {
      return Voca(
          id: maps[i]['id'],
          word: maps[i]['word'],
          meaning: maps[i]['meaning'],
          createTime: maps[i]['createTime']);
    });
  }

//update voca list
  Future<void> updateVoca(Voca voca) async {
    final db = await database;
    await db.update(
      'vocas',
      voca.toMap(),
      where: "id = ?", 
      whereArgs: [voca.id],
    );
  }

//delete voca
  Future<void> deleteVoca(String id) async {
    final db = await database;
    await db.delete(
      'vocas',
      where: "id = ?",
      whereArgs: [id],
    );
  }

//find voca to edit
  Future<List<Voca>> findVoca(String id) async {
    final db = await database;

    final List<Map<String, dynamic>> maps =
        await db.query('vocas', where: 'id = ?', whereArgs: [id]);

    return List.generate(maps.length, (i) {
      return Voca(
        id: maps[i]['id'],
        word: maps[i]['word'],
        meaning: maps[i]['meaning'],
        createTime: maps[i]['createTime'],
      );
    });
  }

//export voca to csv
  Future exportVoca() async {
    var year = DateFormat('yy').format(DateTime.now());
    var month = DateFormat('MM').format(DateTime.now());
    var day = DateFormat('d').format(DateTime.now());

    final db = await database;
    var result = await db.query('vocas');
    var csv = mapListToCsv(result);
    final directory = await getApplicationDocumentsDirectory();
    final pathOfFile = await directory.path;
    File file = File("$pathOfFile/dontForget_$year$month$day.csv");
    file.writeAsString(csv);
  }

//import csv to sqlite
  Future importVoca() async {
    File file = await FilePicker.getFile(
        type: FileType.custom, allowedExtensions: ['csv']);
    final data = file.openRead();
    final fields = await data
        .transform(utf8.decoder)
        .transform(new CsvToListConverter())
        .toList();

    Database _db = await openDatabase(
        join(await getDatabasesPath(), 'vocas.db'),
        version: 1, onCreate: (Database db, int version) async {
      await db.execute("DROP TABLE IF EXISTS vocas");
      await db.execute(
          "CREATE TABLE vocas(id TEXT PRIMARY KEY, word TEXT, meaning TEXT, createTime TEXT)");
    });
  }
}
RyanIdea
  • 1,289
  • 2
  • 8
  • 16

0 Answers0