在这里,我想在我的
bookmark新闻应用程序中添加flutter功能。Iget来自APIs的数据。我会在下面显示这些数据。
我使用这个片段来用
SQflite保存数据,如下所示。我用名字bookmark_db_provider.dart保存这个文件。
import 'dart:io';
import 'home_screen_data.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
class DBProvider {
static Database _database;
static final DBProvider db = DBProvider._();
DBProvider._();
Future<Database> get database async {
if (_database != null) _database = await initDB();
return _database;
}
initDB() async {
Directory documentsDirectory = await getApplicationDocumentsDirectory();
final path = join(documentsDirectory.path, 'ProductData.db');
return await openDatabase(path, version: 1, onOpen: (db) {},
onCreate: (Database db, int version) async {
await db.execute('CREATE TABLE ProductData('
'id INTEGER PRIMARY KEY,' //id
'categoryName Text,' //headline
'publisherName Text,' //description
'isAvailable Text,' //content
'categoryImgUrl Text' //image
')');
});
}
createProductData(ProductData productData) async {
await deleteAllProductData();
final db = await database;
final res = await db.insert('ProductData', productData.toJson());
return res;
}
Future<int> deleteAllProductData() async {
final db = await database;
final res = await db.delete('DELETE FROM ProductData');
return res;
}
Future<List<ProductData>> getProductDataList() async {
final db = await database;
final res = await db.rawQuery("SELECT * FROM ProductData");
List<ProductData> list = res.isNotEmpty ? res.map((x) => ProductData.fromJson(x)).toList() : [];
return list;
}
}所以,我想知道如何在save data和get data中使用SQflite database在flutter中。我是怎么做到的?
发布于 2021-09-23 03:33:45
这是一个古老的问题,希望你已经得到了答案。然而,很多使用sqflite的颤振开发都在处理上述类型的嵌套数组格式中的数据。
``` {"id":1,
“名称”:"xyz“
“图像”:[
{ "imageId": 1, "image": "image1"},{ "imageId": 2, "image": "image2"}]
}
由于json处理目前不是sqflite的一部分,因此建议将内部数组保存为表数据的“image”列中的string/text字段(例如** )。
"[{"imageId":1,“图像”:'image1'},{"imageId":2,“图像”:'image2'},}“
**,无担保。
或者,b.使内部数组变平,以便只有**
数据,名字,image1,image2,image3 .
**这种方法在给定的简单数组中是可能的,但在复杂的系统中是可能的。扁平化可能真的很麻烦。
我的建议是,创建两个表,一个用于数据,另一个用于图像。让每行图像表与相应的数据表行具有引用或关系。您的数据类和图像类将类似于
类数据{
int dataId;String name;List<Image> images;data({this.id, this.images, this.name});...和
类图像{
int imageId;int dataId;String image;Image({this.imageId, this.dataId, this.image});...} 您的sqflite表数据将只有两个字段“dataId”和“name”,图像表必须包含“dataId”作为两个表之间的关系。
要保存数据,可以使用以下事务
void saveData(数据数据,Map映射)异步{
await db.execute(""" INSERT INTO "data" (name) values (?) """, [data.name]);//检索插入的新行的dataId。如果数据库不包含在完成事务之前可能已更新或保存的多个表,也可以使用last_inserted_rowid。
int dataId;
List<Map> x = await db.query('data', columns: ['dataId'], where: 'name = ?', whereArgs: [data.name]);dataId = x[x.length - 1]['dataId'];db.transaction((txn) async { var batch = txn.batch(); data.images .map((e) => { batch.rawInsert( """ INSERT INTO "images" (dataId,image,) values (?,?,?,? ) """, [dataId, e.image]) }).toList();});}
to retrieve data and images, you can try something like
```javascriptData _data =新数据();
未来fetchData()异步{
if (db != null) { // do not execute if db is not instantiate //retrieve all data from data table and store in instantiated, also instantiate images array as empty list final dataList = await db.query(data); _data = (dataList as List) .map( (data) => Data( dataId: data['dataId'], name: data['name'], images: data['images'] != null ? data['images'] : [] )) .toList(); _data.forEach((data) async {if (data.images != null) { List<Image> _images = []; var imageResults = await db.query(images,where: 'dataId =?', whereArgs: [data.dataId]); _images = (imageResults as List).map((e) => Image( imageId: e['imageId'], dataId: e['dataId'], image: e['image'] )).toList(); _data.images.addAll(_images); } });}}
使用这种方法,您应该能够处理嵌套数组的颤振和sqflite。
发布于 2020-05-13 11:15:34
我可能对你的问题不太清楚,但根据我的理解,
您需要用所需的数据调用此提供程序的方法:
DBProvider.init() // Use this only one which when the application is instaled之后,您可以从任何地方调用这些方法来放置和获取数据。
DBProvider.createProductData(productData) //insert data获取数据
DBProvider.getProductDataList() //get data https://stackoverflow.com/questions/61772924
复制相似问题