local_database_visual_debugger 0.0.1 copy "local_database_visual_debugger: ^0.0.1" to clipboard
local_database_visual_debugger: ^0.0.1 copied to clipboard

A plug-and-play in-app database viewer and inspector for Flutter.

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:hive/hive.dart';
import 'package:path_provider/path_provider.dart';
import 'package:local_database_visual_debugger/local_database_visual_debugger.dart';

enum AvailableDatabase { sqlite, sharedPreferences, hive, objectBox, realm }

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // Initialize a dummy SQLite database
  final dbPath = await getDatabasesPath();
  final path = join(dbPath, 'dummy.db');

  final db = await openDatabase(
    path,
    version: 1,
    onCreate: (db, version) async {
      await db.execute('''
        CREATE TABLE users (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          name TEXT,
          email TEXT
        )
      ''');
      await db.insert('users', {'name': 'Alice', 'email': 'alice@example.com'});
      await db.insert('users', {'name': 'Bob', 'email': 'bob@example.com'});
      await db.insert('users', {
        'name': 'Charlie',
        'email': 'charlie@example.com',
      });
    },
  );

  // Initialize dummy SharedPreferences
  final prefs = await SharedPreferences.getInstance();
  await prefs.setString('app_theme', 'dark');
  await prefs.setInt('launch_count', 42);
  await prefs.setBool('is_logged_in', true);

  // Initialize dummy Hive
  final appDocumentDir = await getApplicationDocumentsDirectory();
  Hive.init(appDocumentDir.path);
  final settingsBox = await Hive.openBox('settings');
  await settingsBox.put('volume', 80);
  await settingsBox.put('notifications_enabled', true);

  final cacheBox = await Hive.openBox('cache');
  await cacheBox.put('last_sync', '2023-10-27T10:00:00Z');

  final sqliteAdapter = SqliteAdapter(db);
  final prefsAdapter = SharedPreferencesAdapter(prefs);
  final hiveAdapter = HiveAdapter(['settings', 'cache']);

  // --- Dummy ObjectBox Setup (Demonstrating generic configuration) ---
  final dummyObjectBoxStore = 'MockObjectBoxStore';
  final Map<int, Map<String, dynamic>> mockObjectBoxData = {
    1: {'id': 1, 'name': 'John Doe', 'age': 30},
    2: {'id': 2, 'name': 'Jane Doe', 'age': 28},
  };
  final objectBoxAdapter = ObjectBoxAdapter(
    store: dummyObjectBoxStore,
    accessors: {
      'UserBox': ObjectBoxAccessor(
        getAllRecords: () async => mockObjectBoxData.values.toList(),
        putRecord: (data) async => mockObjectBoxData[data['id']] = data,
        deleteRecord: (id) async => mockObjectBoxData.remove(id),
      ),
    },
  );

  // --- Dummy Realm Setup (Demonstrating generic configuration) ---
  final dummyRealm = 'MockRealmInstance';
  final Map<int, Map<String, dynamic>> mockRealmData = {
    101: {'id': 101, 'title': 'Buy groceries', 'isCompleted': false},
    102: {'id': 102, 'title': 'Write Flutter code', 'isCompleted': true},
  };
  final realmAdapter = RealmAdapter(
    realm: dummyRealm,
    accessors: {
      'Task': RealmAccessor(
        getAllRecords: () async => mockRealmData.values.toList(),
        putRecord: (data) => mockRealmData[data['id']] = data,
        deleteRecord: (id) => mockRealmData.remove(id),
      ),
    },
  );

  runApp(
    MyApp(
      sqliteAdapter: sqliteAdapter,
      prefsAdapter: prefsAdapter,
      hiveAdapter: hiveAdapter,
      objectBoxAdapter: objectBoxAdapter,
      realmAdapter: realmAdapter,
    ),
  );
}

class MyApp extends StatefulWidget {
  final DatabaseAdapter sqliteAdapter;
  final DatabaseAdapter prefsAdapter;
  final DatabaseAdapter hiveAdapter;
  final DatabaseAdapter objectBoxAdapter;
  final DatabaseAdapter realmAdapter;

  const MyApp({
    super.key,
    required this.sqliteAdapter,
    required this.prefsAdapter,
    required this.hiveAdapter,
    required this.objectBoxAdapter,
    required this.realmAdapter,
  });

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  AvailableDatabase _selectedDb = AvailableDatabase.sqlite;

  DatabaseAdapter _getActiveAdapter() {
    switch (_selectedDb) {
      case AvailableDatabase.sqlite:
        return widget.sqliteAdapter;
      case AvailableDatabase.sharedPreferences:
        return widget.prefsAdapter;
      case AvailableDatabase.hive:
        return widget.hiveAdapter;
      case AvailableDatabase.objectBox:
        return widget.objectBoxAdapter;
      case AvailableDatabase.realm:
        return widget.realmAdapter;
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Local DB Debugger Example',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: LocalDbViewer(
        key: ValueKey(_selectedDb), // Force recreation when switching adapters
        adapter: _getActiveAdapter(),
        forceEnable: true, // Show in all modes for the example
        child: Scaffold(
          appBar: AppBar(title: const Text('Flutter Demo Home Page')),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                const Text('Look at the floating bug button.'),
                const SizedBox(height: 20),
                DropdownButton<AvailableDatabase>(
                  value: _selectedDb,
                  onChanged: (AvailableDatabase? newValue) {
                    if (newValue != null) {
                      setState(() {
                        _selectedDb = newValue;
                      });
                    }
                  },
                  items: AvailableDatabase.values.map((
                    AvailableDatabase dbType,
                  ) {
                    return DropdownMenuItem<AvailableDatabase>(
                      value: dbType,
                      child: Text(dbType.name.toUpperCase()),
                    );
                  }).toList(),
                ),
                const SizedBox(height: 10),
                Text(
                  'Currently using: ${_selectedDb.name.toUpperCase()} Adapter',
                  style: const TextStyle(fontWeight: FontWeight.bold),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}
3
likes
140
points
11
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

A plug-and-play in-app database viewer and inspector for Flutter.

Repository (GitHub)
View/report issues

License

MIT (license)

Dependencies

drift, flutter, hive, isar, path_provider, share_plus, shared_preferences, sqflite

More

Packages that depend on local_database_visual_debugger