尝试将数据作为 BLOB 插入,出现参数错误
Trying to insert data as a BLOB, getting Argument Error
在我的 Flutter 项目中,我有一个 class 类别 包含一个字符串、图标、图标数据和两种颜色:
(我不想存储图标,因为我可以用我的 iconData 重新创建它)
class Category {
Icon icon;
IconData iconData;
Color color;
Color backgroundcolor;
String name;
[...]
Map<String, dynamic> toMap() {
return {
'iconData': iconData,
'color': color,
'backgroundcolor': backgroundcolor,
'name': name
};
}
对于我的项目,我导入了 sqflite 数据库,创建了一个 table 类别(使用 "CREATE TABLE categories(name TEXT, iconData BLOB, color BLOB, backgroundcolor BLOB")),现在想使用以下内容将一个类别插入我的数据库中:
Future<void> insertCategory(Category category) async {
// get reference to the database
final Database db = await database;
// insert new category
await db.insert('categories', category.toMap(),
conflictAlgorithm: ConflictAlgorithm.replace);
print("Category inserted.");
}
但是当我尝试插入类别时出现参数错误(无效参数:'IconData' 的实例)并且我无法弄清楚问题所在。
你可以保存String类型的图标数据
并且您需要从字符串到您的图标的映射 Icons 或 FontAwesomeIcons 或 ...
Map<String, IconData> iconMapping = {
'facebook' : FontAwesomeIcons.facebook,
'twitter' : FontAwesomeIcons.twitter,
'home' : FontAwesomeIcons.home,
'audiotrack' : Icons.audiotrack,
};
@override
Widget build(BuildContext context) {
return Icon(iconMapping [icon], color: HexColor(color));
}
类似的问答
我的解决方法如下:
使用
创建数据库
CREATE TABLE categories( iconData INTEGER, backgroundcolor INTEGER, name TEXT PRIMARY KEY)
我的toMap()是
Map<String, dynamic> toMap() {
// Color is stored in a 32-bit integer with alpha, red, green, blue -> ARGB
int bc = backgroundcolor.alpha << 8;
bc = bc + backgroundcolor.red << 8;
bc = bc + backgroundcolor.green << 8;
bc = bc + backgroundcolor.blue;
return {
'iconData': iconData.codePoint,
'backgroundcolor': bc,
'name': name
};
我用
阅读我的类别
Future<List<Category>> getCategoriesFromDatabase() async {
// get reference to database
final Database db = await database;
// Query the table for all categories
final List<Map<String, dynamic>> maps = await db.query('categories');
print("Categories read.");
// Convert the List<Map<String, dynamic> into a List<Category>
return List.generate(maps.length, (i) {
// Construct backgroundcolor
Color bc = Color(maps[i]['backgroundcolor']);
// Construct iconData
IconData id =
IconData(maps[i]['iconData'], fontFamily: Icons.ac_unit.fontFamily);
return Category(
name: maps[i]['name'],
iconData: id,
backgroundcolor: bc,
);
});
}
此解决方法适用于大多数数据类型。例如,我使用相同的解决方案来存储日期。我保存了一年、一个月、一天……并且在从数据库中读取时我构建了一个 dart 日期。
在我的 Flutter 项目中,我有一个 class 类别 包含一个字符串、图标、图标数据和两种颜色: (我不想存储图标,因为我可以用我的 iconData 重新创建它)
class Category {
Icon icon;
IconData iconData;
Color color;
Color backgroundcolor;
String name;
[...]
Map<String, dynamic> toMap() {
return {
'iconData': iconData,
'color': color,
'backgroundcolor': backgroundcolor,
'name': name
};
}
对于我的项目,我导入了 sqflite 数据库,创建了一个 table 类别(使用 "CREATE TABLE categories(name TEXT, iconData BLOB, color BLOB, backgroundcolor BLOB")),现在想使用以下内容将一个类别插入我的数据库中:
Future<void> insertCategory(Category category) async {
// get reference to the database
final Database db = await database;
// insert new category
await db.insert('categories', category.toMap(),
conflictAlgorithm: ConflictAlgorithm.replace);
print("Category inserted.");
}
但是当我尝试插入类别时出现参数错误(无效参数:'IconData' 的实例)并且我无法弄清楚问题所在。
你可以保存String类型的图标数据
并且您需要从字符串到您的图标的映射 Icons 或 FontAwesomeIcons 或 ...
Map<String, IconData> iconMapping = {
'facebook' : FontAwesomeIcons.facebook,
'twitter' : FontAwesomeIcons.twitter,
'home' : FontAwesomeIcons.home,
'audiotrack' : Icons.audiotrack,
};
@override
Widget build(BuildContext context) {
return Icon(iconMapping [icon], color: HexColor(color));
}
类似的问答
我的解决方法如下:
使用
创建数据库CREATE TABLE categories( iconData INTEGER, backgroundcolor INTEGER, name TEXT PRIMARY KEY)
我的toMap()是
Map<String, dynamic> toMap() {
// Color is stored in a 32-bit integer with alpha, red, green, blue -> ARGB
int bc = backgroundcolor.alpha << 8;
bc = bc + backgroundcolor.red << 8;
bc = bc + backgroundcolor.green << 8;
bc = bc + backgroundcolor.blue;
return {
'iconData': iconData.codePoint,
'backgroundcolor': bc,
'name': name
};
我用
阅读我的类别Future<List<Category>> getCategoriesFromDatabase() async {
// get reference to database
final Database db = await database;
// Query the table for all categories
final List<Map<String, dynamic>> maps = await db.query('categories');
print("Categories read.");
// Convert the List<Map<String, dynamic> into a List<Category>
return List.generate(maps.length, (i) {
// Construct backgroundcolor
Color bc = Color(maps[i]['backgroundcolor']);
// Construct iconData
IconData id =
IconData(maps[i]['iconData'], fontFamily: Icons.ac_unit.fontFamily);
return Category(
name: maps[i]['name'],
iconData: id,
backgroundcolor: bc,
);
});
}
此解决方法适用于大多数数据类型。例如,我使用相同的解决方案来存储日期。我保存了一年、一个月、一天……并且在从数据库中读取时我构建了一个 dart 日期。