tekartik / sqflite

SQLite flutter plugin
BSD 2-Clause "Simplified" License
2.87k stars 521 forks source link

openDatabase doesn't work properly ? #507

Open abdullahrss opened 4 years ago

abdullahrss commented 4 years ago

I have calendar app. I use db for keep event informations. The database sometimes works, sometimes it does not work, locking the application with the following errors. I dont have any word the describe this error. I don't know why its happens.

  static Database _database;

  DbHelper._createInstance();

  static final DbHelper instance = DbHelper._createInstance();

  Future<Database> get database async {
    debugPrint("[dataBaseHelper] get database working...");
    if (_database != null) {
      debugPrint("[dataBaseHelper] _database is not null");
      return _database;
    }
    debugPrint("[dataBaseHelper] _database is null");
    _database = await _initDatabase(); ///  (package:ajanda/databasehelper/dataBaseHelper.dart:49)
    return _database;
  }

  Future<Database> _initDatabase() async {
    debugPrint("[dataBaseHelper] [_initDatabase] initDatabase working...");
    Directory directory = await getApplicationDocumentsDirectory();
    String path = directory.path + 'dbtakvim.db';
    return await openDatabase(path,version: 2,onCreate: (Database database, int version)async{
      ///       (package:ajanda/databasehelper/dataBaseHelper.dart:61)
      await database.execute(
          'CREATE TABLE $_tableName ( $_columnId INTEGER PRIMARY KEY NOT NULL, $_columnTitle TEXT ,$_columnDate TEXT,$_columnStartTime TEXT,$_columnFinishTime TEXT, $_columnDesc TEXT, $_columnIsActive INTEGER, $_columnNotification TEXT, $_columnCountdownIsActive INTEGER, $_columnAttachments TEXT, $_columnCc TEXT, $_columnBb TEXT, $_columnRecipient TEXT, $_columnSubject TEXT, $_columnBody TEXT, $_columnPeriodic INTEGER, $_columnFrequency TEXT)');
    });
  }
Future<bool> openNotificationBar() async {
    debugPrint("[dataBaseHelper] [openNotificationBar] func working...");
    Database db = await this.database; ///  (package:ajanda/databasehelper/dataBaseHelper.dart:220)

    SettingsDbHelper settingsDbHelper = SettingsDbHelper();
    var not = Notifications(flutterLocalNotificationsPlugin);

    /// Gerekli sartlari [countDownIsActive(Sabit bildirim) - periodic(Periyotlu event)] saglayan eventler databaseden aliniyor
    var result;
    try {
      result = await db.rawQuery(
          "SELECT * FROM $_tableName WHERE $_columnCountdownIsActive=1 OR $_columnPeriodic!=0");
    } catch (e) {
      debugPrint("[ERROR] [DATABASEHELPER] [openNotificationBar] $e");
      debugPrint("[openNotificationBar] db value : ${db.runtimeType}");
    }
    ...

flutter run --release -v Logs :

[+4754 ms] I/flutter ( 8254): [backgroundProcesses] startBgServicesManually end... [ ] I/flutter ( 8254): [dataBaseHelper] [openNotificationBar] func working... [ ] I/flutter ( 8254): [dataBaseHelper] get database working... [ ] I/flutter ( 8254): [dataBaseHelper] _database is null [ ] I/flutter ( 8254): [dataBaseHelper] [_initDatabase] initDatabase working... [ +74 ms] I/flutter ( 8254): [dataBaseHelper] get database working... [ ] I/flutter ( 8254): [dataBaseHelper] _database is null [ ] I/flutter ( 8254): [dataBaseHelper] [_initDatabase] initDatabase working... [+1028 ms] I/flutter ( 8254): [dataBaseHelper] [openNotificationBar] func working... [ +1 ms] I/flutter ( 8254): [dataBaseHelper] get database working... [ ] I/flutter ( 8254): [dataBaseHelper] _database is null [ ] I/flutter ( 8254): [dataBaseHelper] [_initDatabase] initDatabase working... [ +83 ms] I/flutter ( 8254): error DatabaseException(Cannot perform this operation because there is no current transaction.) sql 'COMMIT' args []} during open, closing... [ +27 ms] I/flutter ( 8254): [ERROR] [DATABASEHELPER] [openNotificationBar] DatabaseException(no such table: tblevents (code 1 SQLITE_ERROR): , while compiling: SELECT FROM tblevents WHERE countdown=1 OR periodic!=0) sql 'SELECT FROM tblevents WHERE countdown=1 OR periodic!=0' args []} [ +1 ms] I/flutter ( 8254): [openNotificationBar] db value : SqfliteDatabaseBase [ +85 ms] E/flutter ( 8254): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: DatabaseException(Cannot perform this operation because there is no current transaction.) sql 'COMMIT' args []} [ ] E/flutter ( 8254): #0 wrapDatabaseException (package:sqflite/src/exception_impl.dart:11) [ +1 ms] E/flutter ( 8254): [ ] E/flutter ( 8254): #1 SqfliteDatabaseMixin.txnSynchronized (package:sqflite_common/src/database_mixin.dart:312) [ ] E/flutter ( 8254): [ ] E/flutter ( 8254): #2 SqfliteDatabaseMixin.endTransaction (package:sqflite_common/src/database_mixin.dart:459) [ ] E/flutter ( 8254): [ ] E/flutter ( 8254): #3 SqfliteDatabaseMixin._runTransaction (package:sqflite_common/src/database_mixin.dart:481) [ ] E/flutter ( 8254): [ ] E/flutter ( 8254): #4 SqfliteDatabaseMixin.txnSynchronized (package:sqflite_common/src/database_mixin.dart:312) [ ] E/flutter ( 8254): [ ] E/flutter ( 8254): #5 SqfliteDatabaseMixin.doOpen (package:sqflite_common/src/database_mixin.dart:696) [ ] E/flutter ( 8254): [ ] E/flutter ( 8254): #6 SqfliteDatabaseOpenHelper.openDatabase (package:sqflite_common/src/database.dart:46) [ ] E/flutter ( 8254): [ ] E/flutter ( 8254): #7 SqfliteDatabaseFactoryMixin.openDatabase. (package:sqflite_common/src/factory_mixin.dart:104) [ ] E/flutter ( 8254): [ ] E/flutter ( 8254): #8 ReentrantLock.synchronized. (package:synchronized/src/reentrant_lock.dart:38) [ ] E/flutter ( 8254): [ ] E/flutter ( 8254): #9 BasicLock.synchronized (package:synchronized/src/basic_lock.dart:34) [ ] E/flutter ( 8254): [ ] E/flutter ( 8254): #10 DbHelper._initDatabase (package:ajanda/databasehelper/dataBaseHelper.dart:61) [ ] E/flutter ( 8254): [ +2 ms] E/flutter ( 8254): #11 DbHelper.database (package:ajanda/databasehelper/dataBaseHelper.dart:49) [ +1 ms] E/flutter ( 8254): [ +2 ms] E/flutter ( 8254): #12 DbHelper.openNotificationBar (package:ajanda/databasehelper/dataBaseHelper.dart:220) [ ] E/flutter ( 8254): [ ] E/flutter ( 8254): [+58764 ms] I/flutter ( 8254): [dataBaseHelper] [openNotificationBar] func working... [ +8 ms] I/flutter ( 8254): [dataBaseHelper] get database working... [ ] I/flutter ( 8254): [dataBaseHelper] _database is not null [ ] I/flutter ( 8254): [dataBaseHelper] [controlDates] controlDates working... [ ] I/flutter ( 8254): [dataBaseHelper] get database working... [ ] I/flutter ( 8254): [dataBaseHelper] _database is not null [ +14 ms] I/flutter ( 8254): [ERROR] [DATABASEHELPER] [openNotificationBar] DatabaseException(no such table: tblevents (code 1 SQLITE_ERROR): , while compiling: SELECT FROM tblevents WHERE countdown=1 OR periodic!=0) sql 'SELECT FROM tblevents WHERE countdown=1 OR periodic!=0' args []} [ ] I/flutter ( 8254): [openNotificationBar] db value : SqfliteDatabaseBase [ +2 ms] E/flutter ( 8254): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: NoSuchMethodError: The getter 'length' was called on null. [ ] E/flutter ( 8254): Receiver: null [ ] E/flutter ( 8254): Tried calling: length [ ] E/flutter ( 8254): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:51) [ ] E/flutter ( 8254): #1 DbHelper.openNotificationBar (package:ajanda/databasehelper/dataBaseHelper.dart:237) [ ] E/flutter ( 8254): [ ] E/flutter ( 8254): [ ] I/flutter ( 8254): [ERROR] [DATABASEHELPER] [controlDates] DatabaseException(no such table: tblevents (code 1 SQLITE_ERROR): , while compiling: SELECT FROM tblevents WHERE periodic!=0) sql 'SELECT FROM tblevents WHERE periodic!=0' args []} [ ] I/flutter ( 8254): [controlDates] db value : SqfliteDatabaseBase [ ] E/flutter ( 8254): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: NoSuchMethodError: The method 'forEach' was called on null. [ ] E/flutter ( 8254): Receiver: null [ ] E/flutter ( 8254): Tried calling: forEach(Closure: (dynamic) => Null) [ ] E/flutter ( 8254): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:51) [ ] E/flutter ( 8254): #1 DbHelper.controlDates (package:ajanda/databasehelper/dataBaseHelper.dart:336) [ ] E/flutter ( 8254): [ ] E/flutter ( 8254):

The reason for the length and forEach errors is that the database is not visible. At least i think like that.

flutter doctor -v

[√] Flutter (Channel stable, 1.20.3, on Microsoft Windows [Version 10.0.19041.508], locale tr-TR) • Flutter version 1.20.3 at C:\src\flutter • Framework revision 216dee60c0 (2 weeks ago), 2020-09-01 12:24:47 -0700 • Engine revision d1bc06f032 • Dart version 2.9.2

[√] Android toolchain - develop for Android devices (Android SDK version 30.0.0) • Android SDK at C:\src\Android-SDK • Platform android-30, build-tools 30.0.0 • Java binary at: D:\AndroidStdio\jre\bin\java • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01) • All Android licenses accepted.

[√] Android Studio (version 4.0) • Android Studio at D:\AndroidStdio • Flutter plugin version 47.1.2 • Dart plugin version 193.7361 • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)

[!] IntelliJ IDEA Community Edition (version 2019.2) • IntelliJ at D:\IntelliJ\IntelliJ IDEA Community Edition 2019.2.2 X Flutter plugin not installed; this adds Flutter specific functionality. • Dart plugin version 192.7761 • For information about installing plugins, see https://flutter.dev/intellij-setup/#installing-the-plugins

[√] Connected device (1 available) • Android SDK built for x86 64 (mobile) • emulator-5554 • android-x64 • Android 9 (API 28) (emulator)

! Doctor found issues in 1 category.

When I run flutter clean first and then flutter run --release it gives this error.

[+4480 ms] I/flutter (12789): [backgroundProcesses] startBgServicesManually end... [ +1 ms] I/flutter (12789): [dataBaseHelper] [openNotificationBar] func working... [ ] I/flutter (12789): [dataBaseHelper] get database working... [ ] I/flutter (12789): [dataBaseHelper] _database is null [ ] I/flutter (12789): [dataBaseHelper] [_initDatabase] initDatabase working... [ +58 ms] I/flutter (12789): [dataBaseHelper] get database working... [ ] I/flutter (12789): [dataBaseHelper] _database is null [ ] I/flutter (12789): [dataBaseHelper] [_initDatabase] initDatabase working... [ +823 ms] I/flutter (12789): [dataBaseHelper] [openNotificationBar] func working... [ ] I/flutter (12789): [dataBaseHelper] get database working... [ ] I/flutter (12789): [dataBaseHelper] _database is null [ ] I/flutter (12789): [dataBaseHelper] [_initDatabase] initDatabase working... [ +115 ms] I/flutter (12789): error DatabaseException(table tblevents already exists (code 1 SQLITE_ERROR): , while compiling: CREATE TABLE tblevents( id INTEGER PRIMARY KEY NOT NULL, title TEXT ,date TEXT,startTime TEXT,finishTime TEXT, description TEXT, isActive INTEGER, notifications TEXT, countdown INTEGER, attachments TEXT, cc TEXT, bb TEXT, recipient TEXT, subject TEXT, body TEXT, periodic INTEGER, frequcency TEXT)) sql 'CREATE TABLE tblevents( id INTEGER PRIMARY KEY NOT NULL, title TEXT ,date TEXT,startTime TEXT,finishTime TEXT, description TEXT, isActive INTEGER, notifications TEXT, countdown INTEGER, attachments TEXT, cc TEXT, bb TEXT, recipient TEXT, subject TEXT, body TEXT, periodic INTEGER, frequcency TEXT)' args []} during open, closing... [ +7 ms] I/flutter (12789): [ERROR] [DATABASEHELPER] [openNotificationBar] DatabaseException(database_closed 2) [ ] I/flutter (12789): [openNotificationBar] db value : SqfliteDatabaseBase [ +6 ms] E/flutter (12789): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: NoSuchMethodError: The getter 'length' was called on null. [ ] E/flutter (12789): Receiver: null [ ] E/flutter (12789): Tried calling: length [ ] E/flutter (12789): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:51) [ ] E/flutter (12789): #1 DbHelper.openNotificationBar (package:ajanda/databasehelper/dataBaseHelper.dart:237) [ ] E/flutter (12789):

StatTark commented 4 years ago

@abdullahrss i have same issue

blunderous commented 4 years ago

I usually stop the app, unninstal, change the db name, run the app and everything works again. After that, I stop the app, revert the name that was originaly used, and rerun it. Its a weird error.

HTMHell commented 3 years ago

@abdullahrss did you figure it out? this is happening to me as well. most of the times Database object is fine, but sometimes it's null.

(and yes, I have an await to openDatabase() method.)

masa8 commented 3 months ago

Do you have multiple classes accessing the same DB and call openDatabase() multiple times?

If so, setting the singleInstance argument of openDatabase() to false may solve the problem.

However, depending on how you use it, it may cause other problems, such as race conditions though.