Flutter SQLite Kullanımı: Yerel Veritabanı İşlemleri

Posted by

Flutter, çapraz platform mobil uygulama geliştirme için popüler bir seçenektir. Uygulamalarınızda verilerin yerel cihazda depolanması ve veri yönetiminin daha etkili bir şekilde yapılması için önemlidir. SQLite, yerel veritabanı ihtiyaçlarınızı karşılayan hafif ve yaygın bir çözümdür. Şimdi Bu yazıda, Flutter uygulamalarında SQLite kullanımı adım adım açıklayacak ve örneklerle konuyu pekiştireceğiz.

flutter sqlite kullanımı

Adım 1: sqflite Paketini Ekleyin SQLite kullanımı için Flutter’da yerel bir paket olan sqflite‘ı projenize eklemelisiniz. pubspec.yaml dosyasına giderek, sqflite paketini ekleyin ve paketleri güncellemek için terminalde flutter pub get komutunu çalıştırın. Ayrıca https://pub.dev/packages/sqflite adresinden paketi inceliyebilirsiniz.

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0
  path: ^2.0.0

Adım 2: Veritabanını Oluşturma ve Yapılandırma SQLite veritabanını oluşturmak için bir yardımcı sınıf oluşturmalıyız. Bu sınıf, veritabanını açmak, oluşturmak ve yapılandırmak için kullanılacaktır.

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

class DatabaseHelper {
  static final DatabaseHelper _instance = DatabaseHelper.internal();

  factory DatabaseHelper() => _instance;

  static late Database _db;

  DatabaseHelper.internal();

  Future<Database> get db async {
    if (_db != null) {
      return _db;
    }
    _db = await initDatabase();
    return _db;
  }

  Future<Database> initDatabase() async {
    String databasesPath = await getDatabasesPath();
    String path = join(databasesPath, 'my_database.db');

    return await openDatabase(
      path,
      version: 1,
      onCreate: _onCreate,
    );
  }

  void _onCreate(Database db, int version) async {
    await db.execute(
      'CREATE TABLE my_table(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)',
    );
  }
}

Adım 3: Oluşturduğumuz veritabanı yardımcı sınıfını kullanarak veri ekleme ve sorgulama işlemlerini gerçekleştirelim.

class DatabaseHelper {
  // ... diğer kodlar ...

  Future<int> insertData(Map<String, dynamic> data) async {
    Database db = await this.db;
    return await db.insert('my_table', data);
  }

  Future<List<Map<String, dynamic>>> getData() async {
    Database db = await this.db;
    return await db.query('my_table');
  }
}

Adım 4: Veri Ekleme ve Sorgulama Kullanımı Şimdi veri ekleme ve sorgulama işlemlerini kullanarak verileri veritabanına ekleyelim ve sorgulayalım:

void main() async {
  var dbHelper = DatabaseHelper();

  // Veri ekleme
  Map<String, dynamic> row = {
    'name': 'John Doe',
    'age': 30,
  };
  int id = await dbHelper.insertData(row);
  print('Eklenen verinin ID\'si: $id');

  // Veri sorgulama
  List<Map<String, dynamic>> allData = await dbHelper.getData();
  for (var data in allData) {
    print('ID: ${data['id']}, Name: ${data['name']}, Age: ${data['age']}');
  }
}

Flutter SQLite kullanımı – Görev Listesi Uygulaması Örneği

Bu sefer SQLite kullanarak bir basit görev listesi uygulaması yapalım. Kullanıcı, görevleri ekleyebilecek, listeleyebilecek ve tamamladığı görevleri işaretleme özelliğine sahip olacak.

import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TaskListScreen(),
    );
  }
}

class DatabaseHelper {
  static final DatabaseHelper _instance = DatabaseHelper.internal();

  factory DatabaseHelper() => _instance;

  static late Database _db;

  DatabaseHelper.internal();

  Future<Database> get db async {
    if (_db != null) {
      return _db;
    }
    _db = await initDatabase();
    return _db;
  }

  Future<Database> initDatabase() async {
    String databasesPath = await getDatabasesPath();
    String path = join(databasesPath, 'task_database.db');

    return await openDatabase(
      path,
      version: 1,
      onCreate: _onCreate,
    );
  }

  void _onCreate(Database db, int version) async {
    await db.execute(
      'CREATE TABLE tasks(id INTEGER PRIMARY KEY, title TEXT, isComplete INTEGER)',
    );
  }

  Future<int> insertTask(Map<String, dynamic> task) async {
    Database db = await this.db;
    return await db.insert('tasks', task);
  }

  Future<List<Map<String, dynamic>>> getTasks() async {
    Database db = await this.db;
    return await db.query('tasks');
  }

  Future<void> updateTask(int id, int isComplete) async {
    Database db = await this.db;
    await db.update(
      'tasks',
      {'isComplete': isComplete},
      where: 'id = ?',
      whereArgs: [id],
    );
  }
}

class TaskListScreen extends StatefulWidget {
  @override
  _TaskListScreenState createState() => _TaskListScreenState();
}

class _TaskListScreenState extends State<TaskListScreen> {
  TextEditingController _taskController = TextEditingController();
  List<Map<String, dynamic>> _tasks = [];

  @override
  void initState() {
    super.initState();
    _fetchTasks();
  }

  _fetchTasks() async {
    var dbHelper = DatabaseHelper();
    List<Map<String, dynamic>> tasks = await dbHelper.getTasks();
    setState(() {
      _tasks = tasks;
    });
  }

  _addTask() async {
    var dbHelper = DatabaseHelper();
    Map<String, dynamic> task = {
      'title': _taskController.text,
      'isComplete': 0,
    };
    int id = await dbHelper.insertTask(task);
    _taskController.clear();
    _fetchTasks();
  }

  _toggleTask(int id, int isComplete) async {
    var dbHelper = DatabaseHelper();
    int newStatus = isComplete == 0 ? 1 : 0;
    await dbHelper.updateTask(id, newStatus);
    _fetchTasks();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Görev Listesi'),
      ),
      body: Column(
        children: [
          Padding(
            padding: EdgeInsets.all(16),
            child: Row(
              children: [
                Expanded(
                  child: TextField(
                    controller: _taskController,
                    decoration: InputDecoration(
                      hintText: 'Görev adı girin',
                    ),
                  ),
                ),
                IconButton(
                  icon: Icon(Icons.add),
                  onPressed: _addTask,
                ),
              ],
            ),
          ),
          Expanded(
            child: ListView.builder(
              itemCount: _tasks.length,
              itemBuilder: (context, index) {
                var task = _tasks[index];
                return ListTile(
                  title: Text(task['title']),
                  trailing: Checkbox(
                    value: task['isComplete'] == 1,
                    onChanged: (value) {
                      _toggleTask(task['id'], task['isComplete']);
                    },
                  ),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

Bu örnek, Flutter uygulamasında basit bir görev listesi yapısını nasıl oluşturabileceğiniz gösteriyor. Ayrıca verileri SQLite veritabanında nasıl saklayıp güncelleyebileceğinizi gösteriyor. Uygulamada “sqflite” paketini kullanarak veritabanını oluşturuyoruz ve görevleri eklemek, listelemek ve tamamladığımız görevleri işaretlemek için gerekli işlemleri gerçekleştiriyoruz. Bu örnek, temel bir veritabanı işlemi yapmayı anlamak için faydalı olacaktır.

Flutter’da SQLite kullanarak yerel veritabanı işlemleri gerçekleştirmek oldukça kolaydır. Bu yazıda, SQLite paketini eklemeyi, veritabanını oluşturmayı ve yapılandırmayı, veri ekleme ve sorgulama işlemlerini adım adım açıkladık. Ayrıca Örneklerle konuyu pekiştirerek, yerel veritabanı kullanımının nasıl yapılacağını öğrendiniz. Umarım bu yazı, Flutter geliştiricilere SQLite kullanımı konusunda yardımcı olur!

Daha fazla flutter ile ilgili blog yazılarımıza buradan ulaşabilirsiniz.

İlginizi Çekebilir

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir