SQFlite从API插入大量数据

问题描述

将API中的数据插入sql数据库时,我收到以下警告。

I/Flutter ( 3905): Warning database has been locked for 0:00:10.000000. Make sure you always use the transaction object for database operations during a transaction
I/chatty  ( 3905): uid=11130(u0_a1130) Thread-5 identical 2191 lines
I/Flutter ( 3905): Warning database has been locked for 0:00:10.000000. Make sure you always use the transaction object for database operations during a transaction
I/Flutter ( 3905): Warning database has been locked for 0:00:10.000000. Make sure you always use the transaction object for database operations during a transaction
I/chatty  ( 3905): uid=11130(u0_a1130) Thread-5 identical 127 lines
I/Flutter ( 3905): Warning database has been locked for 0:00:10.000000. Make sure you always use the transaction object for database operations during a transaction
I/Flutter ( 3905): Warning database has been locked for 0:00:10.000000. Make sure you always use the transaction object for database operations during a transaction
I/Flutter ( 3905): Warning database has been locked for 0:00:10.000000. Make sure you always use the transaction object for database operations during a transaction
I/Flutter ( 3905): Warning database has been locked for 0:00:10.000000. Make sure you always use the transaction object for database operations during a transaction
I/chatty  ( 3905): uid=11130(u0_a1130) Thread-5 identical 72 lines
I/Flutter ( 3905): Warning database has been locked for 0:00:10.000000. Make sure you always use the transaction object for database operations during a transaction
I/Flutter ( 3905): Warning database has been locked for 0:00:10.000000. Make sure you always use the transaction object for database operations during a transaction
I/chatty  ( 3905): uid=11130(u0_a1130) Thread-5 identical 3 lines
I/Flutter ( 3905): Warning database has been locked for 0:00:10.000000. Make sure you always use the transaction object for database operations during a transaction
I/Flutter ( 3905): Warning database has been locked for 0:00:10.000000. Make sure you always use the transaction object for database operations during a transaction 

总而言之,我想说它要输入到表中的大约6-7,000个对象。在解决此问题的研究中,我遇到了一个名为批处理的概念,但是我没有看到足够完整的示例让我自己实现。

这是我的代码

import 'dart:io';
import 'dart:async';

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';

import '../models/located_company_model.dart';

class DBHelper {
  static Database _database;
  static final DBHelper db = DBHelper._();

  DBHelper._();

  Future<Database> get database async {
    // if database exists,return database
    if (_database != null) return _database;
    // if database doesn't exist,create one
    _database = await initDB();

    return _database;
  }

  // create the database and LocatedCompany table
  Future<Database> initDB() async {
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path,'located_companies.db');

    return await openDatabase(path,version: 1,onCreate: (Database db,int version) async {
      await db.execute('''
          CREATE TABLE Companies (
            symbol TEXT PRIMARY KEY,exchange TEXT,name TEXT,region TEXT,currency TEXT
          )
        ''');
    });
  }

// insert company on database
  Future<void> insertCompany(LocatedCompany newCompany) async {
    final db = await database;
    final res = await db.insert('Companies',newCompany.toJson(),conflictAlgorithm: ConflictAlgorithm.replace,);
    return res;
  }

  // delete all companies
  Future<int> deleteallCompanies() async {
    final db = await database;
    final res = await db.rawDelete('DELETE FROM Companies');

    return res;
  }

  Future<List<LocatedCompany>> getAllCompanies() async {
    final db = await database;
    final res = await db.rawQuery('SELECT * FROM COMPANIES');

    List<LocatedCompany> list = res.isNotEmpty
        ? res.map((c) => LocatedCompany.fromJson(c)).toList()
        : [];

    return list;
  }

  //return single company's symbol by name search
  Future<LocatedCompany> getCompanySymbol(String name) async {
    final db = await database;
    var response = await db.query('Companies',where: 'symbol = ?',whereArgs: [name]);
    return response.isNotEmpty ? LocatedCompany.fromJson(response.first) : null;
  }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)