我正在看这个(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文件(其值与用户类相对应),是否可以使用数据库资产填写该信息,然后在其中调用扑扑的应用程序?我意识到可能有很多方法可以解决此问题,但是.db文件到底存储了什么,以及如何格式化?我可以在此.db文件中实现.csv文件吗?
答案 0 :(得分:8)
首先,您需要从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放入您的资产中,并将其添加到pubspec.yaml中。
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;
示例查询(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);
}
答案 1 :(得分:1)
此.db文件用于在其中保存SQL数据,因此您可以使用SQL命令保存和获取数据。插件本身将解析.db文件中的数据。
如果要将数据另存为CSV并在课堂上进行解析,最好将数据存储在原始文件中(将here保存为原始文件)或使用this plugin。 虽然,还有其他方法可以将数据另存为JSON文件或将其保存在key-value pair中。
答案 2 :(得分:1)
将资产添加到文件系统中项目的根目录。创建资产文件夹并将您的数据库文件放入其中:
assets/examples.db
在波动部分中指定pubspec.yaml中的资产
flutter:
assets:
- assets/example.db
然后,您将需要打开数据库(如果存在)或进行复制(如果不存在)。
此处的链接显示了用于打开/复制现有的sqlite数据库的代码:
https://github.com/tekartik/sqflite/blob/master/sqflite/doc/opening_asset_db.md