local_database_visual_debugger 0.0.1
local_database_visual_debugger: ^0.0.1 copied to clipboard
A plug-and-play in-app database viewer and inspector for Flutter.
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),
),
],
),
),
),
),
);
}
}