【问题标题】:can't save contacts to local db in flutter无法将联系人保存到本地数据库中
【发布时间】:2021-09-10 14:03:51
【问题描述】:

我正在尝试使用 sqflite 在颤振中将联系人从手机保存到本地数据库,但在将数据从联系人保存到 sql 表时出错。
我不明白如何从 Contact_service 保存数据到localdb。我使用contact_service包从手机中获取联系人。

 import 'dart:io';

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

class ContactDatabase {
  static final _databaseName = "contact.db";
  static final _databaseVersion = 1;
  List<Contact> contact = [];

  ContactDatabase._init();

  static Database _database;
  static final ContactDatabase instance = ContactDatabase._init();

  Future<Database> get database async {
    if (_database != null) return _database;
    _database = await _initDB();
    return _database;
  }

  _initDB() async {
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, _databaseName);
    return await openDatabase(path,
        version: _databaseVersion, onCreate: _onCreate);
  }

  static final contact_table = 'contacts';
  static final id = 'id';
  static final name = 'name';
  static final phone = 'phone';
  static final avatar = 'avatar';
  static final synced = 'synced';

  static final CREATE_TABLE = "CREATE TABLE $contact_table"
      "($name TEXT ,"
      "$phone TEXT ,"
      "$avatar TEXT ,"
      "$synced INTEGER DEFAULT '0' ,"
      "$id INTEGER PRIMARY KEY AUTOINCREMENT)";

  Future _onCreate(Database db, int version) async {
    await db.execute('$CREATE_TABLE');
  }

  Future<int> insert(table, Map<String, dynamic> row) async {
    Database db = await instance.database;
    return await db.insert(table, row,
        conflictAlgorithm: ConflictAlgorithm.replace);
  }

  Future<void> inserContact() async {
    contact = (await ContactsService.getContacts()).toList();
    for (var i = 0; i < 10; i++) {
      Map<String, dynamic> row = {
        name: contact[i].displayName,
        phone: contact[i].displayName,
        avatar: "NA",
        synced: 1,
      };
      insert(contact_table, row);
    }
  }

  Future<List<Map<String, dynamic>>> queryAllRows() async {
    Database db = await instance.database;
    return await db.query(contact_table);
  }
}

谁能给我一个解决方案

【问题讨论】:

  • 您已经有解决方案了吗?

标签: database flutter sqlite dart sqflite


【解决方案1】:
      Future<void> insertContact() async {
    if (!await FlutterContacts.requestPermission(readonly: true)) {
      setState(() => _permissionDenied = true);
    } else {
      final contacts = await FlutterContacts.getContacts();
      setState(() => _contacts = contacts);

      for (var i = 0; i <= _contacts!.length; i++) {
        final fullContact = await FlutterContacts.getContact(_contacts![i].id);

        if (fullContact!.phones.first.normalizedNumber.isNotEmpty &&
            fullContact!.phones.first.normalizedNumber.replaceAll(' ', '').length > 8) {
          savecontact(userid, _contacts![i].displayName, fullContact.phones.first.normalizedNumber);
        }
      }
    }
  }

使用 flutter_contacts 我解决了这个问题,将号码保存在数据库中

希望它对社区等有所帮助。

但出现错误:

未处理的异常:RangeError(索引):无效值:不在包含范围内

https://github.com/QuisApp/flutter_contacts/issues/46

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多