0
import 'package:permission_handler/permission_handler.dart';
import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:flutter/src/widgets/placeholder.dart';
import 'package:minwentaryzacja/common/permission.dart';
import 'package:minwentaryzacja/common/textFormField.dart';
import 'package:minwentaryzacja/common/toastHelper.dart';
import 'package:minwentaryzacja/databaseHandler/dbHelper.dart';

import 'package:minwentaryzacja/screens/signupForm.dart';
import 'package:minwentaryzacja/widget/inwentaryzacje.dart';

class LoginForm extends StatefulWidget {
  const LoginForm({super.key, required this.title});

  final String title;

  @override
  State<LoginForm> createState() => _LoginFormState();
}

class _LoginFormState extends State<LoginForm> {
  bool _obscureText = true;

  final _formKey = new GlobalKey<FormState>();

  final _conUserId = TextEditingController();
  final _conPassword = TextEditingController();
  var dbHelper = DbHelper();

  @override
  void dispose() {
    _conUserId.dispose();
    _conPassword.dispose();
    super.dispose();
  }

  @override
  void initState() {
    super.initState();
    dbHelper = DbHelper();
  }

  void login() async {
    final form = _formKey.currentState;
    String uid = _conUserId.text;
    String password = _conPassword.text;

    print(uid);
    print(password);
    if (uid.isEmpty) {
      showSnackBarDialog(context, "Podaj Użytkownika");
    } else if (password.isEmpty) {
      showSnackBarDialog(context, "Podaj Hasło");
    } else {
      await dbHelper.getLoginUser(uid, password).then((userData) {
        Navigator.pushAndRemoveUntil(
            context,
            MaterialPageRoute(builder: (_) => Inwentaryzacje()),
            (Route<dynamic> route) => false);
      }).catchError((error) =>
          {print(error), showSnackBarDialog(context, "Error, błąd logowania")});
    }
  }

  void _toggle() {
    setState(() {
      _obscureText = !_obscureText;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: const BoxDecoration(
          image: DecorationImage(
              image: AssetImage("assets/images/background.png"),
              fit: BoxFit.cover)),
      child: Scaffold(
        backgroundColor: Colors.transparent,
        // appBar: AppBar(
        //   title: Text(widget.title),
        // ),
        body: SingleChildScrollView(
          scrollDirection: Axis.vertical,
          child: Container(
            width: double.infinity,
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                SizedBox(
                  height: 30.0,
                ),
                Row(
                  mainAxisAlignment: MainAxisAlignment.start,
                  children: [
                    // Expanded(
                    //     child: SizedBox(
                    //   width: 10.0,
                    // )),
                    Padding(
                      padding: EdgeInsets.only(left: 20, top: 20),
                      child: Image.asset(
                        "assets/images/logo.png",
                        width: 100,
                      ),
                    ),
                    Expanded(
                        child: SizedBox(
                      width: 10.0,
                    )),
                  ],
                ),
                SizedBox(
                  height: 80.0,
                ),
                Text(
                  "Inwentaryzacja",
                  style: TextStyle(
                      fontWeight: FontWeight.bold,
                      color: Theme.of(context).primaryColor,
                      fontSize: 45),
                ),
                SizedBox(
                  height: 70.0,
                ),
                Text(
                  "Logowanie",
                  style: TextStyle(
                      fontWeight: FontWeight.normal,
                      color: Theme.of(context).primaryColor,
                      fontSize: 25.0),
                ),
                SizedBox(
                  height: 10,
                ),
                getTextFormField(
                  controller: _conUserId,
                  hintName: "Użytkownik",
                  icon: Icons.person,
                ),
                SizedBox(
                  height: 10,
                ),
                // getTextFormField(
                //   controller: _conUserId,
                //   hintName: "Hasło",
                //   icon: Icons.person,
                //   isobscureText: true,
                // ),
                // Container(
                //   margin: EdgeInsets.only(left: 50, right: 50),
                //   child: TextFormField(
                //     obscureText: _obscureText,
                //     decoration: InputDecoration(
                //         border: InputBorder.none,
                //         enabledBorder: OutlineInputBorder(
                //             borderRadius: BorderRadius.all(Radius.circular(20)),
                //             borderSide: BorderSide(color: Colors.transparent)),
                //         focusedBorder: OutlineInputBorder(
                //           borderRadius: BorderRadius.all(Radius.circular(20)),
                //         ),
                //         prefixIcon: Icon(Icons.lock),
                //         suffixIcon: IconButton(
                //           onPressed: _toggle,
                //           icon: Icon(_obscureText
                //               ? Icons.visibility
                //               : Icons.visibility_off),
                //         ),
                //         hintText: "Hasło",
                //         fillColor: Colors.grey[200],
                //         filled: true),
                //   ),
                // ),
                getTextFormField(
                  controller: _conPassword,
                  hintName: "Hasło",
                  icon: Icons.lock,
                  isobscureText: true,
                ),
                Container(
                    width: double.infinity,
                    margin: EdgeInsets.only(top: 30, left: 50, right: 50),
                    child: TextButton(
                        child: Text(
                          "Zaloguj",
                          style:
                              TextStyle(color: Theme.of(context).primaryColor),
                        ),
                        onPressed: login,
                        style: TextButton.styleFrom(
                          shape: RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(12),
                          ),
                          foregroundColor: Theme.of(context).primaryColor,
                          padding: const EdgeInsets.all(20.0),
                          backgroundColor:
                              // Theme.of(context).colorScheme.primary,
                              Theme.of(context).backgroundColor,
                        ))),
                Container(
                    width: double.infinity,
                    margin: EdgeInsets.only(top: 10, left: 50, right: 50),
                    child: TextButton(
                      child: Text(
                        "Zgoda",
                        style: TextStyle(color: Theme.of(context).primaryColor),
                      ),
                      onPressed: () async {
                        PermissionStatus _permisionStatus =
                            await Permission.storage.request();
                        if (_permisionStatus == PermissionStatus.granted) {
                          ScaffoldMessenger.of(context).showSnackBar(
                              const SnackBar(
                                  content: Text("Permission storage")));
                        }

                        if (_permisionStatus == PermissionStatus.denied) {
                          ScaffoldMessenger.of(context).showSnackBar(
                              const SnackBar(
                                  content:
                                      Text("This permisison is recommended")));
                        }
                        if (_permisionStatus ==
                            PermissionStatus.permanentlyDenied) {
                          openAppSettings();
                        }
                      },
                    )),
                Container(
                    width: double.infinity,
                    margin: EdgeInsets.only(top: 10, left: 50, right: 50),
                    child: TextButton(
                      child: Text(
                        "Przejdź do rejestracji",
                        style: TextStyle(color: Theme.of(context).primaryColor),
                      ),
                      onPressed: () {
                        Navigator.of(context).pushNamed(SignUpForm.routeName);
                      },
                    )),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

My db helper

import 'dart:io' as io;
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:minwentaryzacja/model/Adresy.dart';
import 'package:minwentaryzacja/model/JednostkiOrganizacyjne.dart';
import 'package:minwentaryzacja/model/Majatek.dart';
import 'package:minwentaryzacja/model/Odpowiedzialni.dart';
import 'package:path/path.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:typed_data';

class InwentaryzacjDbHelper {
  static final _directoryPath = '/storage/emulated/0/Documents/';
  static final _databaseName = 'InwentaryzacjaDane.db';
  static Database? _db;

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

  initDB() async {
    try {
      if (await Permission.storage.request().isGranted) {
        io.Directory? dir = await getExternalStorageDirectory();
        String path = join(dir!.path, _directoryPath, _databaseName);
        io.File file = io.File(path);
        var theDB = await openDatabase(path, version: 1);
        print("Znaleziono bazę danych");
        return theDB;
      } else {
        throw Exception("Storage permission not granted");
      }
    } catch (e) {
      print("Błąd inicjalizacji bazy danych: $e");
      rethrow;
    }

    
  }

  

  Future<List<Odpowiedzialni>> getOdpowiedzialni() async {
    var dbClient = await db;

    final res1 = await dbClient!.query("Odpowiedzialni");
    print(res1);
    List<Map> list = await dbClient!.rawQuery('SELECT * FROM Odpowiedzialni');
    List<Odpowiedzialni> odpowiedzialni = [];
    for (int i = 0; i < list.length; i++) {
      odpowiedzialni.add(new Odpowiedzialni(
        uzytkownik: list[i]['Uzytkownik'],
        nazwiskoImie: list[i]['NazwiskoImie'],
        wazneOd: list[i]['WazneOd'],
        wazneDo: list[i]['WazneDo'],
      ));
    }

    return odpowiedzialni;
  }

  
}

My Error

E/SQLiteDatabase(29942): Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14 SQLITE_CANTOPEN): Could not open database
E/SQLiteDatabase(29942):    at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
E/SQLiteDatabase(29942):    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:224)
E/SQLiteDatabase(29942):    ... 15 more
I/flutter (29942): Błąd inicjalizacji bazy danych: DatabaseException(open_failed /storage/emulated/0/Documents/InwentaryzacjaDane.db)
E/flutter (29942): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: DatabaseException(open_failed /storage/emulated/0/Documents/InwentaryzacjaDane.db)

The database file is located in the directory '/storage/emulated/0/Documents/'; When the file is initialized in a different way (from data/data/com.example.minwentaryzacja/ ) Using this code io.Directory documentsDirectory = await getApplicationDocumentsDirectory(); String path = join(documentsDirectory.path, "InwentaryzacjaDane.db");

bool exists = await io.File(path).exists();
 var theDB = await openDatabase(path, version: 1);
return theDB;

. Not from an external "storage" path All work fine. But unfortunately the file must necessarily be stored in external storage or on the sd card

My dependencies

dependencies: flutter: sdk: flutter path_provider: ^2.0.2 sqflite: ^2.2.6 toast: ^0.2.9 overlay_support: ^2.1.0 intl: ^0.18.1 permission_handler: ^10.0.0

How to make the file readable without any problem. ( The file is already in '/storage/emulated/0/Documents/'; ) But then I get an error when initializing the database.

OnePanic
  • 11
  • 3
  • Does this answer your question? [How to store sqlite database directly on sdcard](https://stackoverflow.com/questions/14373863/how-to-store-sqlite-database-directly-on-sdcard) – dstreissi Apr 25 '23 at 13:44

0 Answers0