我正在查看此(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文件,其中包含所有用户信息(其值与用户类相对应),我是否可以使用数据库资产填写该信息,然后在flutter应用程序内部对其进行调用?我意识到可能有很多方法可以解决此问题,但是.db文件到底存储了什么,以及它如何格式化?我可以在此.db文件中实现.csv文件吗?
首先,您需要从csv构建一个sqlite数据库。这可以通过以下方式完成:
CREATE TABLE users( firstname TEXT NOT NULL, lastname TEXT NOT NULL, dob TEXT NOT NULL );
创建sqlite数据库
sqlite3 database.db < users.sql
插入CSV数据
sqlite3 database.db .mode csv .import data.csv users
flutter: # ... assets: - assets/database.db
// 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); }
Directory appDocDir = await getApplicationDocumentsDirectory(); String databasePath = join(appDocDir.path, 'asset_database.db'); this.db = await openDatabase(databasePath); initialized = true;
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); }