Coder Social home page Coder Social logo

sqlcool's Introduction

Sqlcool

pub package

A database helper library for Sqflite. Forget about implementation details and focus on the business logic. Features:

  • Simple api for crud operations
  • Changefeed: a stream to monitor database changes
  • Select bloc: a ready to use reactive bloc for select operations

Check the documentation for usage instructions

Simple crud

import 'package:sqlcool/sqlcool.dart';

void someFunc() async {
   Db db = Db();
   String dbpath = "db.sqlite"; // relative to the documents directory
   await db.init(path: dbpath, fromAsset: "assets/db.sqlite", verbose: true).catchError((e) {
       print("Error initializing the database: ${e.message}");
   });
   // insert
   Map<String, String> row = {
    slug: "my-item",
    name: "My item",
   };
   await db.insert(table: "category", row: row, verbose: true).catchError((e) {
       print("Error inserting data: ${e.message}");
   });
   // select
   List<Map<String, dynamic>> rows = await db.select(
     table: "product", limit: 20, columns: "id,name",
     where: "name LIKE '%something%'",
     orderBy: "name ASC").catchError((e) {
       print("Error selecting data: ${e.message}");
   });
   //update
   Map<String, String> row = {
    slug: "my-item-new",
    name: "My item new",
   };
   int updated = await db.update(table: "category", 
       row: row, where: "id=1", verbose: true).catchError((e) {
          print("Error updating data: ${e.message}");
   });
   // delete
   db.delete(table: "category", where: "id=3").catchError((e) {
       print("Error deleting data: ${e.message}");
   });
}

Changefeed

A stream of database change events is available

import 'dart:async';
import 'package:sqlcool/sqlcool.dart';

StreamSubscription _changefeed;

_changefeed = db.changefeed.listen((change) {
   print("CHANGE IN THE DATABASE:");
   print("Query: ${change.query}");
   if (change.type == DatabaseChange.update) {
     print("${change.value} items updated");
   }
 });
// _changefeed.cancel();

Reactive select bloc

The bloc will rebuild itself on any database change because of the reactive parameter set to true:

import 'package:flutter/material.dart';
import 'package:sqlcool/sqlcool.dart';

class _PageSelectBlocState extends State<PageSelectBloc> {
  SelectBloc bloc;

  @override
  void initState() {
    super.initState();
    this.bloc = SelectBloc(
        table: "items", orderBy: "name", reactive: true, verbose: true);
  }

  @override
  void dispose() {
    bloc.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("My app"),
      ),
      body: StreamBuilder<List<Map>>(
          stream: bloc.items,
          builder: (BuildContext context, AsyncSnapshot snapshot) {
            if (snapshot.hasData) {
              // the select query has not found anything
              if (snapshot.data.length == 0) {
                return Center(
                  child: Text(
                      "No data"),
                );
              }
              // the select query has results
              return ListView.builder(
                  itemCount: snapshot.data.length,
                  itemBuilder: (BuildContext context, int index) {
                    var item = snapshot.data[index];
                    return ListTile(
                      title: GestureDetector(
                        child: Text(item["name"]),
                        onTap: () => print("Action"),
                      ),
                    );
                  });
            } else {
              // the select query is still running
              return CircularProgressIndicator();
            }
          }),
    );
  }
}

class PageSelectBloc extends StatefulWidget {
  @override
  _PageSelectBlocState createState() => _PageSelectBlocState();
}

Todo

  • Upsert
  • Batch operations

sqlcool's People

Contributors

synw avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.