首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用sqflite保存嵌套列表?

如何用sqflite保存嵌套列表?
EN

Stack Overflow用户
提问于 2020-05-13 11:03:37
回答 2查看 2.3K关注 0票数 1

在这里,我想在我的bookmark新闻应用程序中添加flutter功能。I get来自APIs的数据。我会在下面显示这些数据。

此图向您展示了如何从API中获取数据

我使用这个片段来用SQflite保存数据,如下所示。我用名字bookmark_db_provider.dart保存这个文件。

代码语言:javascript
复制
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 dataget data中使用SQflite databaseflutter中。我是怎么做到的?

EN

回答 2

Stack Overflow用户

发布于 2021-09-23 03:33:45

这是一个古老的问题,希望你已经得到了答案。然而,很多使用sqflite的颤振开发都在处理上述类型的嵌套数组格式中的数据。

代码语言:javascript
复制
``` {

"id":1,

“名称”:"xyz“

“图像”:[

代码语言:javascript
复制
{
代码语言:javascript
复制
  "imageId": 1,
代码语言:javascript
复制
  "image": "image1"
代码语言:javascript
复制
},
代码语言:javascript
复制
{
代码语言:javascript
复制
  "imageId": 2,
代码语言:javascript
复制
  "image": "image2"
代码语言:javascript
复制
}

]

}

代码语言:javascript
复制

由于json处理目前不是sqflite的一部分,因此建议将内部数组保存为表数据的“image”列中的string/text字段(例如** )。

"[{"imageId":1,“图像”:'image1'},{"imageId":2,“图像”:'image2'},}“

**,无担保。

或者,b.使内部数组变平,以便只有**

数据,名字,image1,image2,image3 .

**这种方法在给定的简单数组中是可能的,但在复杂的系统中是可能的。扁平化可能真的很麻烦。

我的建议是,创建两个表,一个用于数据,另一个用于图像。让每行图像表与相应的数据表行具有引用或关系。您的数据类和图像类将类似于

代码语言:javascript
复制

类数据{

代码语言:javascript
复制
int dataId;
代码语言:javascript
复制
String name;
代码语言:javascript
复制
List<Image> images;
代码语言:javascript
复制
data({this.id, this.images, this.name});
代码语言:javascript
复制
...
代码语言:javascript
复制

代码语言:javascript
复制

类图像{

代码语言:javascript
复制
int imageId;
代码语言:javascript
复制
int dataId;
代码语言:javascript
复制
String image;
代码语言:javascript
复制
Image({this.imageId, this.dataId, this.image});
代码语言:javascript
复制
...
代码语言:javascript
复制
} 
代码语言:javascript
复制

您的sqflite表数据将只有两个字段“dataId”和“name”,图像表必须包含“dataId”作为两个表之间的关系。

要保存数据,可以使用以下事务

代码语言:javascript
复制

void saveData(数据数据,Map映射)异步{

代码语言:javascript
复制
await db.execute(""" INSERT INTO "data" (name) values (?) """, [data.name]);

//检索插入的新行的dataId。如果数据库不包含在完成事务之前可能已更新或保存的多个表,也可以使用last_inserted_rowid。

int dataId;

代码语言:javascript
复制
List<Map> x = await db.query('data', columns: ['dataId'], where: 'name = ?', whereArgs: [data.name]);
代码语言:javascript
复制
dataId = x[x.length - 1]['dataId'];
代码语言:javascript
复制
db.transaction((txn) async {
代码语言:javascript
复制
  var batch = txn.batch();
代码语言:javascript
复制
  data.images
代码语言:javascript
复制
      .map((e) => {
代码语言:javascript
复制
            batch.rawInsert(
代码语言:javascript
复制
                """ INSERT INTO "images" (dataId,image,) values (?,?,?,? ) """, [dataId, e.image])
代码语言:javascript
复制
          }).toList();
代码语言:javascript
复制
});

}

代码语言:javascript
复制
代码语言:javascript
复制
to retrieve data and images, you can try something like

```javascript
代码语言:javascript
复制

Data _data =新数据();

未来fetchData()异步{

代码语言:javascript
复制
if (db != null) {
代码语言:javascript
复制
  // do not execute if db is not instantiate
代码语言:javascript
复制
  //retrieve all data from data table and store in instantiated, also instantiate images array as empty list
代码语言:javascript
复制
  final dataList = await db.query(data);
代码语言:javascript
复制
  _data = (dataList as List)
代码语言:javascript
复制
      .map(
代码语言:javascript
复制
        (data) => Data(
代码语言:javascript
复制
          dataId: data['dataId'],
代码语言:javascript
复制
          name: data['name'],
代码语言:javascript
复制
         images: data['images'] != null ? data['images'] : []
代码语言:javascript
复制
        )) .toList();
代码语言:javascript
复制
  _data.forEach((data)  async {if (data.images != null) {
代码语言:javascript
复制
    List<Image> _images = [];
代码语言:javascript
复制
    var imageResults = await db.query(images,where: 'dataId =?', whereArgs: [data.dataId]);
代码语言:javascript
复制
    _images = (imageResults as List).map((e) => Image(
代码语言:javascript
复制
      imageId: e['imageId'],
代码语言:javascript
复制
      dataId: e['dataId'],
代码语言:javascript
复制
      image: e['image']
代码语言:javascript
复制
    )).toList();
代码语言:javascript
复制
    _data.images.addAll(_images);       
代码语言:javascript
复制
  }  });
代码语言:javascript
复制
}

}

代码语言:javascript
复制
代码语言:javascript
复制

使用这种方法,您应该能够处理嵌套数组的颤振和sqflite。

票数 1
EN

Stack Overflow用户

发布于 2020-05-13 11:15:34

我可能对你的问题不太清楚,但根据我的理解,

您需要用所需的数据调用此提供程序的方法:

代码语言:javascript
复制
DBProvider.init() // Use this only one which when the application is instaled

之后,您可以从任何地方调用这些方法来放置和获取数据。

代码语言:javascript
复制
DBProvider.createProductData(productData) //insert data

获取数据

代码语言:javascript
复制
DBProvider.getProductDataList() //get data 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61772924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档