MST

星途 面试题库

面试题:Flutter复杂场景下SharedPreferences与SQLite数据同步实现

假设在一个Flutter应用中,部分数据存储在SharedPreferences,部分存储在SQLite,且需要保持两者数据的一致性,例如在用户修改了某项设置(存储在SharedPreferences)后,需要同步到SQLite数据库中。请描述实现这种数据同步的具体思路和关键代码步骤。
35.1万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试

1. 思路

  1. 监听SharedPreferences数据变化:使用SharedPreferences提供的监听机制,当特定数据项发生变化时触发同步操作。
  2. 读取变化的数据:从SharedPreferences中读取发生变化的数据。
  3. 更新SQLite数据库:将读取到的数据更新到SQLite数据库中,确保数据一致性。

2. 关键代码步骤

初始化SharedPreferences和SQLite

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

late SharedPreferences prefs;
late Database database;

Future<void> init() async {
  prefs = await SharedPreferences.getInstance();
  final databasesPath = await getDatabasesPath();
  final path = join(databasesPath, 'example.db');
  database = await openDatabase(
    path,
    version: 1,
    onCreate: (Database db, int version) async {
      await db.execute('''
        CREATE TABLE settings (
          id INTEGER PRIMARY KEY,
          key TEXT UNIQUE,
          value TEXT
        )
      ''');
    },
  );
}

监听SharedPreferences变化

void listenToSharedPreferences() {
  prefs.addListener(() {
    // 假设设置项的key为'setting_key'
    if (prefs.containsKey('setting_key')) {
      String? value = prefs.getString('setting_key');
      updateSQLite('setting_key', value);
    }
  });
}

更新SQLite数据库

Future<void> updateSQLite(String key, String? value) async {
  await database.transaction((txn) async {
    int count = await txn.rawInsert(
      'INSERT OR REPLACE INTO settings (key, value) VALUES (?,?)',
      [key, value],
    );
    print('Number of records inserted or replaced: $count');
  });
}

调用初始化和监听方法

void main() async {
  await init();
  listenToSharedPreferences();
  // 应用其他初始化代码
}