我正在查看此 (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 文件(其值对应于用户类),我是否可以使用数据库 Assets 来填写信息,然后在其中调用它 flutter 应用程序?我意识到可能有很多方法可以解决这个问题,但是 .db 文件究竟是什么存储的,它的格式如何?我可以在这个 .db 文件中实现一个 .csv 文件吗?
最佳答案
首先,您需要从 csv 构建一个 sqlite 数据库。这可以通过以下方式完成:
创建必要的表(users.sql)
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
将 database.db 放入您的 Assets 并添加到 pubspec.yaml。
flutter: # ... assets: - assets/database.db
在您的应用程序中,您必须将 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); }
最后,你可以像这样访问数据库。
Directory appDocDir = await getApplicationDocumentsDirectory(); String databasePath = join(appDocDir.path, 'asset_database.db'); this.db = await openDatabase(databasePath); initialized = true;
查询示例(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); }
关于database - Flutter中的Sqlite,数据库 Assets 如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51384175/