Sqlite во флаттере, как работают активы базы данных

Я смотрю на это (https://github.com/tekartik/sqflite/blob/master/doc/opening_asset_db.md) для заполнения данных, которые уже отформатированы и необходимы приложению, только для функции чтения.

Итак, мое понимание создания базы данных SQLite, когда у нас уже есть вся информация во внешнем файле CSV, заключается в создании моделей классов в файле .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-файл со всей пользовательской информацией внутри него (со значениями, которые соответствуют классу пользователя), могу ли я использовать актив базы данных, чтобы заполнить информацию, а затем вызвать его внутри приложения flutter ? Я понимаю, что, вероятно, есть много способов сделать это, но что именно хранится в файле .db и как он отформатирован? Могу ли я добавить файл .csv в этот файл .db?


person Mfreeman    schedule 17.07.2018    source источник


Ответы (3)


Во-первых, вам нужно будет создать базу данных sqlite из вашего csv. Это можно сделать следующим образом:

  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. Поместите database.db в свои активы и добавьте его в pubspec.yaml.

    flutter:
      # ...
      assets:
        - assets/database.db
    
  5. В вашем приложении вам нужно будет скопировать файл актива в «документы». Это немного сложно.

    // 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. Пример запроса (this._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);
    }
    
person R. C. Howell    schedule 17.07.2018
comment
Возможно, вам потребуется отредактировать .import data.csv для пользователей .import data.csv. Синтаксис говорит, что ему нужна таблица - person Mfreeman; 17.07.2018
comment
Я использую студию Android, и когда я использую файл .db в разделе ресурсов, он говорит, что .db не связан с каким-либо типом файла. - person Mfreeman; 17.07.2018
comment
Это правильно. Расширение файла не обязательно. Вы можете изменить .db на .sqlite3 (что, как я считаю, является обычным явлением) или вообще отказаться от него. Это некритическое предупреждение. Вы можете увидеть в файле readme sqflite, что автор также использует .db. - person R. C. Howell; 17.07.2018
comment
Хорошо, теперь я получаю ошибку кодирования, в нем говорится, что файл был загружен в неправильной кодировке: 'utf-8', - person Mfreeman; 18.07.2018
comment
как должен выглядеть этот файл базы данных, потому что в нем много странных символов - person Mfreeman; 18.07.2018
comment
Это файл базы данных sqlite. Это двоичный файл. Вы получаете сообщение об ошибке, потому что оно не закодировано в utf-8. Если вы попытаетесь открыть его в текстовом редакторе, вы увидите много странных символов, потому что редактор пытается декодировать то, что не следует декодировать. Пожалуйста, следуйте инструкциям, которые я вам предоставил. Вы можете взаимодействовать с вашей базой данных, запустив sqlite3 database.db, который предоставит вам приглашение sqlite. - person R. C. Howell; 18.07.2018
comment
Это отличный ответ. Обратите внимание, что FileSystemEntityType.NOT_FOUND устарел. Используйте FileSystemEntityType.notFound. - person Bryon Nicoson; 26.09.2018
comment
вопрос: нужна ли копия из папки ресурсов в папку документов приложений, если я только читаю данные из базы данных SQLite ?? (т.е. запись в БД не требуется). Можно ли читать данные SQLite непосредственно из местоположения пакета ресурсов (без предварительного копирования в папку документов приложения)? - person iKK; 10.03.2019
comment
«Необработанное исключение: невозможно загрузить актив: assets / mydatabase.sql» в строке ByteData data = await rootBundle.load (join ('assets', 'mydatabase.sql')); - person akshay bhange; 31.05.2019
comment
что такое rootBundle? Как мне его запустить? - person Alicester4WonderlandPresident; 10.06.2019
comment
Не могли бы вы также взглянуть на этот вопрос? stackoverflow.com/ questions / 62697002 / - person Taba; 03.07.2020

Этот файл .db используется для сохранения в нем данных SQL. Таким образом, вы можете сохранять и получать данные с помощью команд SQL. Плагин сам проанализирует данные в файле .db.

Если вы хотите сохранить данные в формате CSV и проанализировать их в классе, лучше хранить данные в необработанном файле (см. здесь для сохранения файла) или используйте этот плагин . Хотя есть и другие способы сохранить данные в виде файла JSON или сохранить их в парах "ключ-значение" пара.

person Yamin    schedule 17.07.2018
comment
Хорошо, так что я сделал дамп mysql и использовал этот .db в качестве ресурса документа, как мне запросить этот файл? Не перечислять его, а чтобы он отображался в терминале - person Mfreeman; 17.07.2018
comment
Ответ Р. С. Хауэлла завершен для использования файлов SQL и CSV. Но я рекомендую использовать JSON с парами ключ-значение. Если вы заинтересованы в этом, скажите мне отредактировать мой ответ и добавить способ JSON. - person Yamin; 18.07.2018

Добавьте актив в файловую систему в корень вашего проекта. Создайте папку с ресурсами и поместите в нее файл db:

assets/examples.db

Укажите актив (ы) в вашем pubspec.yaml в разделе flutter

flutter:

  assets:

    - assets/example.db

Затем вам нужно будет открыть базу данных, если она существует, или скопировать, если ее нет.

Ссылка здесь показывает код для открытия / копирования уже существующей базы данных sqlite:

https://github.com/tekartik/sqflite/blob/master/sqflite/doc/opening_asset_db.md

person live-love    schedule 07.04.2020
comment
Можно ли обновить эту базу данных? Я использую тот же метод, чтобы открыть базу данных, но когда я ее обновляю, ошибок не возникает, но данные не меняются ... любая идея? - person Taba; 02.07.2020