【发布时间】:2020-01-11 07:29:14
【问题描述】:
使用 sqflite 从本地 sql 文件 (chinook.db) 创建列表视图 初步解决的问题: I/flutter(5084):“未来”的实例 参考代码:https://github.com/tekartik/sqflite/blob/master/sqflite/doc/opening_asset_db.md 感谢@aakash 的帮助
main.dart
body: Container(
child: FutureBuilder(
future: getSQL("albums"),
builder: (BuildContext context, AsyncSnapshot snapshot) {
print(snapshot.data);
if (snapshot.data == null) {
return Container(child: Center(child: Text("Loading...")));
} else {
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (BuildContext context, int index) {
return ListTile(
title: Text(snapshot.data[index].title),
);
},
);
}
},
),
),
getSQL.dart
Future getSQL(String tableName) async {
var databasesPath = await getDatabasesPath();
var path = join(databasesPath, "chinook.db");
// Check if the database exists
var exists = await databaseExists(path);
if (!exists) {
// Should happen only the first time you launch your application
print("Creating new copy from asset");
// Make sure the parent directory exists
try {
await Directory(dirname(path)).create(recursive: true);
} catch (_) {}
// Copy from asset
ByteData data = await rootBundle.load(join("assets", "chinook.db"));
List<int> bytes =
data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
// Write and flush the bytes written
await File(path).writeAsBytes(bytes, flush: true);
} else {
print("Opening existing database");
}
// open the database
var db = await openDatabase(path, readOnly: true);
List<Map> list = await db.rawQuery('SELECT * FROM $tableName');
List theList = [];
for (var n in list) {
theList.add(MyCategoryFinal(n["Title"]));
}
return (theList);
}
class MyCategoryFinal {
final String title;
MyCategoryFinal(this.title);
}
【问题讨论】: