我正在寻找这个(https://github.com/tekartik/sqflite/blob/master/doc/opening_asset_db.md),用于填充应用程序已经格式化和需要的数据,仅用于读取功能.

因此,我对在外部CSV文件中已有所有信息时创建SQLite数据库的理解是,在我的应用程序的.dart文件中创建类模型,例如

class User {

  int id;
  String _firstName;
  String _lastName;
  String _dob;

  User(this._firstName, this._lastName, this._dob);

  User.map(dynamic obj) {
    this._firstName = obj["firstname"];
    this._lastName = obj["lastname"];
    this._dob = obj["dob"];
  }

  String get firstName => _firstName;

  String get lastName => _lastName;

  String get dob => _dob;

  Map<String, dynamic> toMap() {
    var map = new Map<String, dynamic>();
    map["firstname"] = _firstName;
    map["lastname"] = _lastName;
    map["dob"] = _dob;
    return map;
  }
  void setUserId(int id) {
    this.id = id;
  }
}

那么,如果我有一个CSV文件,其中包含所有用户信息(具有与User类相对应的值),我是否可以使用数据库assets资源 来填充信息,然后在Ffltter应用程序中调用它?我知道可能有很多方法可以做到这一点,但是.db文件到底存储的是什么,它是如何格式化的呢?我可以在此.db文件中实现.csv文件吗?

推荐答案

首先,您需要从CSV构造一个sqlite数据库.这可以通过以下方式完成:

  1. 创建所需的表(users.sql)

    CREATE TABLE users(
       firstname TEXT NOT NULL,
       lastname TEXT NOT NULL,
       dob TEXT NOT NULL
    );
    
  2. 创建sqlite数据库

    sqlite3 database.db < users.sql
    
  3. 插入CSV数据

    sqlite3 database.db
    .mode csv
    .import data.csv users
    
  4. 放入数据库.将db添加到您的assets资源 中,并将其添加到pubspec中.亚马尔.

    flutter:
      # ...
      assets:
        - assets/database.db
    
  5. 在你的应用程序中,你必须将assets资源 文件复制到"文档"中.这有点复杂.

    // Construct a file path to copy database to
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, "asset_database.db");
    
    // Only copy if the database doesn't exist
    if (FileSystemEntity.typeSync(path) == FileSystemEntityType.notFound){
      // Load database from asset and copy
      ByteData data = await rootBundle.load(join('assets', 'database.db'));
      List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
    
      // Save copied asset to documents
      await new File(path).writeAsBytes(bytes);
    }
    
  6. 最后,您可以像这样访问数据库.

    Directory appDocDir = await getApplicationDocumentsDirectory();
    String databasePath = join(appDocDir.path, 'asset_database.db');
    this.db = await openDatabase(databasePath);
    initialized = true;
    
  7. 示例查询(此._initialize()为步骤6)

    Future<List<Page>> search(String word, int parentId) async {
        if (!initialized) await this._initialize();
        String query = '''
          SELECT * FROM users
          LIMIT 25''';
        return await this.db.rawQuery(query);
    }
    

Dart相关问答推荐

如何扩展 Dart 套接字 BroadcastStream 缓冲区大小为 1024 字节?

Flutter - 对 Cloud Firestore 进行排序

一键式 Flutter 工具提示

如何在 Flutter 中更改 Html 小部件中的字体样式?

Flutter热重新加载和热重启不工作

在 Dart 中将对象推入数组

Flutter url_launcher 未在发布模式下启动 url

Flutter 在整个屏幕上禁用touch

Flutter模糊叠加

如何使用 Dart 动态加载 HTML 并插入我的网页?

给 initState 内部的变量赋值或不在 Flutter StatefulWidget 中赋值有什么区别?

Flutter-当文本字段有焦点时隐藏提示文本

Flutter 示例中的流布局

断言失败时如何在 Dart 中打印消息?

Flutter/Dart:按第一次出现拆分字符串

Dart vs Polymer vs Bootstrap

如何在 Dart 中比较两个对象以查看它们是否是同一个实例?

有没有办法取消dartfuture ?

Dart lambda/shortland 函数混淆

在 Dart 中将类型化函数作为参数传递