首页 文章

SQLite连接在Flutter中返回null

提问于
浏览
2

我在我的应用程序中使用SQFLite颤振包 . 但是,由于与DB的连接,我一直变为null . 下面是我在初始化DB,创建表以及添加项目和获取项目的方法中使用的代码:

import 'package:sqflite/sqflite.dart';
  import 'package:path_provider/path_provider.dart';
  import 'dart:io';
  import 'package:path/path.dart';
  import 'dart:async';

  class StoreDBProvider {

       Database db;

       init() async {
          Directory documentsDirectory = await 
          getApplicationDocumentsDirectory();
          final path = join(documentsDirectory.path, "carts.db");
          db = await openDatabase(
               path,
               version: 3,
               onCreate: (Database newDB, int version){
                     newDB.execute('CREATE TABLE Cart (id INTEGER 
                                PRIMARY KEY, name TEXT, price DOUBLE, image TEXT, rating DOUBLE)');
               }
               );
               return db;
        }


        Future<dynamic> fetchItem(int id) async {
             print("DB CONNECTION IS: $db");

             final maps = await db.query(
                          "Cart",
                          columns: null,
                          where: "id = ?",
                          whereArgs: [id],
             );

             print(maps);

             if(maps.length > 0){
                 print("Data exists");
                 return maps.first;
             }

             return null;
        }


        Future<int> addItem(item) async{
             return db.insert("Cart", item);
        }
}

在一些调试之后,我注意到“db”值为null . 这是错误消息:

E/flutter ( 6921): [ERROR:flutter/shell/common/shell.cc(182)] Dart 
 Error: Unhandled exception:
 E/flutter ( 6921): NoSuchMethodError: The method 'insert' was called on null.
 E/flutter ( 6921): Receiver: null
 E/flutter ( 6921): Tried calling: insert("Cart", _LinkedHashMap len:5)
 E/flutter ( 6921): #0      Object.noSuchMethod 
 (dart:core/runtime/libobject_patch.dart:50:5)
 E/flutter ( 6921): #1      StoreDBProvider.addItem

(文件:///Users/Oluwashola/workspace/fashion_style/lib/src/resources/store_db_provider.dart:46:15)

请在此获得任何帮助 . 谢谢 .

2 回答

  • 0

    如果有帮助,这是我的工作代码 . 注意我在db中使用异步getter并在方法中使用db时等待 . 害怕我也是一个颤抖的新手 .

    注意我通过Future与DatabaseHelper交互 . 请参阅第二个代码块 . 我认为这需要使用FutureBuilder . 我怀疑你需要使用它来处理(略微)缓慢加载异步数据库调用 .

    class DatabaseHelper {
      final String tableName = "Gear";
    
      static Database _db;
    
      Future<Database> get db async {
        if (_db != null) return _db;
        _db = await initDb();
        await importData();
        return _db;
      }
    
      initDb() async {
        // Get a location using path_provider
        var databasesPath = await getDatabasesPath();
        String path = join(databasesPath, "gear_log.db");
    
        await deleteDatabase(path);
        var theDb = await openDatabase(path, version: 1,
            onCreate: (Database db, int version) async {
          print('creating db...');
    
          String sql = await rootBundle.loadString('assets/db/schema.txt');
          for (var s in sql.split(";")) {
            if (s.length > 5) {
              // catching any hidden characters at end of schema
              await db.execute(s + ';');
            }
          }
          // When creating the db, create the table
        });
    
        return theDb;
      }
    
      importData() async {
        final datasources =
            'observation_bodyissue.json,observation_observation.json,observation_observation_bodyIssues.json,observation_observation_shoeIssues.json,observation_shoeissue.json,observation_gearissue.json,runner_runner.json,gear_actualpair.json,gear_characteristic.json,gear_shoe.json,gear_family.json,gear_maker.json,gear_gear.json,gear_gear_characteristics.json,users_user.json'
                .split(',');
        var batch = _db.batch();
    
        for (var datasource in datasources) {
          try {
            String str = await rootBundle.loadString('assets/db/data/$datasource');
            String table = datasource.split('.')[0];
    
            if (str.length > 0 && str != '[]') {
              List<dynamic> _list = await json.decode(str);
              for (var _json in _list) {
                batch.insert(table, _json);
              }
            }
          } catch (e) {
            print(e.toString());
          }
        }
        print('added db data');
        var results = await batch.commit();
        //print(results);
        //print('imported data');
      }
    
      Future<List<Item>> getItems() async {
        var dbClient = await db;
    
        List<Map> list = await dbClient.rawQuery('SELECT *'
            'FROM "gear_actualpair" '
            'DESC, "gear_actualpair"."created" DESC');
    
        //prob need to specify 'first X' at sometime
    
        List<Item> items = new List();
        for (int i = 0; i < list.length; i++) {
          Item item = Item.fromMap(list[i]);
          if (list[i]['selected'] == 1) {
            item.observations = await getObservations(list[i]['id']);
          }
          items.add(item);
        }
    
        return items;
      }
    }
    

    与dbHelper类交互:

    Future<List<Item>> fetchItemsFromDatabase() async {
      var dbHelper = DatabaseHelper();
      Future<List<Item>> items = dbHelper.getItems();
      return items;
    }
    
  • 1

    我有这样的共同抽象提供者:

    abstract class DbProvider<T extends DbItem> {
      static Future<String> get localPath async {
        final directory = await getApplicationDocumentsDirectory();
        return directory.path;
      }
    
      Database db;
    
      Future open() async {
        String path = await localPath;
        db = await openDatabase(join(path, file_name), version: 1, onCreate: (database, version) async {
          await database.execute(''' create table */code for creating table/* ''');
        });
      }
    
      Future _update(T item) async {
        return await db.update(getTableName(), item.toMap(), where: "$col_dbId = ?", whereArgs: [item.dbId]);
      }
    
      Future _insert(T item) async {
        return await db.insert(getTableName(), item.toMap());
      }
    
      Future delete(String dbId) async {
        return await db.delete(getTableName(), where: "$col_dbId = ?", whereArgs: [dbId]);
      }
    
      Future close() => db.close();
    
      Future remove() => db.delete(getTableName());
    
      String getTableName();
    
      Future save(T item);
    
      Future<Iterable<T>> get();
    }
    

    并做一些交易:

    void loadDbData() async {
      FavoriteProvider favoriteProvider = FavoriteProvider();
      await favoriteProvider.open();
      Iterable<DbItem> favorites = await favoriteProvider.getConferences();
      await favoriteProvider.close();
      ...
    }
    

相关问题