flutter sqflite db assets - flutter

I want to access database from assets and I'm getting this error
NoSuchMethodError (NoSuchMethodError: The method 'rawQuery' was called on null.
Receiver: null
Tried calling: rawQuery("SELECT * FROM productss"))
import 'dart:io';
import 'package:path/path.dart';
import 'dart:typed_data';
import 'package:flutter/services.dart';
import 'package:sqflite/sqflite.dart';
class DatabaseHelper2{
static final DatabaseHelper2 _instance = DatabaseHelper2.internal();
factory DatabaseHelper2() =>_instance;
var oneSecond = Duration(seconds: 5);
static Database _db;
Future<Database> get db async{
if(_db != null){
print("database does");
return _db;
}
_db = await initDbs();
print("database doesnt");
return _db;
}
DatabaseHelper2.internal();
initDbs() async{
// Construct a file path to copy database to
var databasesPath = await getDatabasesPath();
var path = join(databasesPath, "productss.db");
// Check if the database exists
var exists = await databaseExists(path);
if (!exists) {
// Should happen only the first time you launch your application
print("Creating new copy from asset");
// Make sure the parent directory exists
try {
await Directory(dirname(path)).create(recursive: true);
} catch (_) {}
// Copy from asset
ByteData data = await rootBundle.load(join("assets", "productss.db"));
List<int> bytes =
data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
// Write and flush the bytes written
await File(path).writeAsBytes(bytes, flush: true);
} else {
print("Opening existing database");
}
// open the database
_db = await openDatabase(path);
}
void productDb2(Database database, int version)async{
await database.execute("""
CREATE TABLE productss
(
id INTEGER PRIMARY KEY,
name TEXT,
price INTEGER,
size INTEGER,
fat100 INTEGER,
carbs100 INTEGER,
protein100 INTEGER,
dateCreated String
)
""");
}
Future<List> getProductsdb()async{
var dbClient = await db;
var result = await dbClient.rawQuery("SELECT * FROM productss");
return result.toList();
}
}
I have no idea why this is happening.
Database isn't null. I checked.

You're trying to await db, but the class property is named _db. Did the IDE not catch this error?

Related

how to use SQlite database using sqflite package in flutter

I'm a beginner in flutter, i want to use SQlite database using sqflite package in my Flutter App,
i have an error when i call the method insertAnnonce saying :
Error: MissingPluginException(No implementation found for method getApplicationDocumentsDirectory on channel plugins.flutter.io/path_provider)
import "dart:io" as io;
import 'dart:io';
import "package:path/path.dart";
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
import 'annonce.model.dart';
class AppData {
static const _dbVersion = 1;
AppData._();
static final AppData instance = AppData._();
static Database? _database;
Future<Database?> get database async {
print("Get database");
print(_database);
print("Get database");
if (_database != null) {
return _database;
}
_database = await _initializeDatabase();
print("initializeDatabase");
print(_database);
print("initializeDatabase");
return _database;
}
Future<Database> _initializeDatabase() async {
print("initializeDatabase");
Directory directory = await getApplicationDocumentsDirectory();
String path = join(directory.path, 'annonce_database.db');
return await openDatabase(path, version: _dbVersion, onCreate: _onCreate);
}
Future _onCreate(Database db, int version) async {
print("_onCreate");
try {
const createQuery = '''
CREATE TABLE `annonce` (`id` INT NOT NULL , `titre` VARCHAR(250) NOT NULL , `prix` INT NOT NULL , `description` TEXT NOT NULL , `idAnnonceur` INT NOT NULL , `active` INT NOT NULL , `isFavorite` INT NOT NULL , `favoriteCount` INT NOT NULL , PRIMARY KEY (`id`));
''';
await db.execute(createQuery);
} catch (e) {}
}
void insertAnnonce(Annonce annonce) async {
final Database db = await database as Database;
print('insertAnnonce');
print(db);
print('insertAnnonce');
await db.insert(
'annonce',
annonce.toMap(),
conflictAlgorithm: ConflictAlgorithm.replace,
);
}
}

Error :The method 'update' isn't defined for the type 'DatabaseException'. Error: The method 'delete' isn't defined for the type 'DatabaseException'

With null safety enabled, I'm using the new dart version <2.18.1>.
this is my code
import 'dart:async';
import 'dart:io';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
import 'package:untitled3/product.dart';
class ProductDBHelper{
static final _databaseName = 'mydb.db';
static final _databaseVersion = 1;
static final _table_products = 'products';
static String? path;
ProductDBHelper._privateContructor();
static final ProductDBHelper instance = ProductDBHelper._privateContructor();
static Database? _database;
///////////// Check whether the database created or not ...........
Future get database async{
if(_database != null) return _database;
_database = await _initDatabase();
return _database;
}
//////////////////////////Inittalize database with lile path, db name .............
_initDatabase() async{
Directory documentDirectory = await getApplicationDocumentsDirectory();
///////// Localstorage path/databasename.db
String path = join(documentDirectory.path , _databaseName);
return await openDatabase(
path,
version: _databaseVersion,
onCreate: _onCreate);
}
///////////////////// On Create for creating datadase ........................
FutureOr _onCreate(Database db, int version) async{
await db.execute('CREATE TABLE $_table_products(id INTEGER PRIMARY KEY autoincrement, name TExt , price TEXT, quantity INTEGER)');
}
static Future getfileData() async
{
return getDatabasesPath().then((value)
{
return path = value;
}
);
}
Future insertProduct(Product product) async {
Database db = await instance.database;
return await db.insert( _table_products, Product.toMap(product) , conflictAlgorithm: ConflictAlgorithm.ignore);
}
Future<List<Product>> getProductList() async{
Database db = await instance.database;
List<Map> maps = await db.query(_table_products);
print(maps);
return Product.fromMapList(maps);
}
Future<Product> updateProduct(Product product) async{
DatabaseException db = await instance.database;
await db.update(_table_products, Product.toMap(product) , where: 'id = ?'
, whereArgs: [product.id]);
return product;
}
Future deleteProduct(Product product) async {
DatabaseException db = await instance.database;
var deletedProduct = await db.delete(_table_products, where: 'id = ?'
, whereArgs: [product.id]);
return product;
}
}
I'm getting these errors:
The method 'update' isn't defined for the type 'DatabaseException'.
The method 'delete' isn't defined for the type 'DatabaseException'.
and this error in the Run log:
lib/product_db_helper.dart:76:14: Error: The method 'update' isn't
defined for the class 'DatabaseException'.
'DatabaseException' is from 'package:sqflite_common/src/exception.dart'
('../../Documents/flutter/Flutter/flutter_windows_3.3.2-stable/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite_common-2.3.0/lib/src/exception.dart').
Try correcting the name to the name of an existing method, or defining
a method named 'update'.
await db.update(_table_products, Product.toMap(product) , where: 'id = ?'
^^^^^^ lib/product_db_helper.dart:84:35: Error: The method 'delete' isn't defined for the class 'DatabaseException'.
'DatabaseException' is from 'package:sqflite_common/src/exception.dart'
('../../Documents/flutter/Flutter/flutter_windows_3.3.2-stable/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite_common-2.3.0/lib/src/exception.dart').
Try correcting the name to the name of an existing method, or defining
a method named 'delete'.
var deletedProduct = await db.delete(_table_products, where: 'id = ?'
^^^^^^
Future<Product> updateProduct(Product product) async{
DatabaseException db = await instance.database;
await db.//update//(_table_products, Product.toMap(product) , where: 'id = ?'
, whereArgs: [product.id]);
return product;
}
Future deleteProduct(Product product) async {
DatabaseException db = await instance.database;
var deletedProduct = await db.//delete//(_table_products, where: 'id = ?'
, whereArgs: [product.id]);
return product;
}
This is where the errors appear. I put // where the red underlines are.
Please help me.
in your updateProduct function,
Change This
DatabaseException db = await instance.database;
to this
Database db = await instance.database;

Issues sqflite in flutter

It's been a while I started flutter. And now I am working on the database part. I started with sqflite since it was the ideal one for offline apps but now I can't understand a thing please can somebody help me with this.
import 'package:flutter/widgets.dart';
import 'note.dart';
import 'package:sqflite/sqflite.dart';
import 'dart:async';
import 'dart:io';
import 'package:path_provider/path_provider.dart';
class DatabaseHelper {
static DatabaseHelper _databaseHelper = DatabaseHelper();
static Database? _database;
String noteTable = 'note_table';
String colID = 'id';
String colTitle = 'title';
String colDescription = 'description';
String colPriority = 'priority';
String colDate = 'date';
DatabaseHelper._createInstance();
factory DatabaseHelper() {
if (_databaseHelper == null) {
var databaseHelper = DatabaseHelper._createInstance();
_databaseHelper = databaseHelper;
}
return _databaseHelper;
}
//custom getter for the database
Future<Database> get database async {
// ignore: prefer_conditional_assignment
if (_database == null) {
_database = await initializeDatabase();
}
return _database!;
}
Future<Database> initializeDatabase() async {
Directory directory = await getApplicationDocumentsDirectory();
String path = directory.path + 'note.db';
var notesDatabase =
await openDatabase(path, version: 1, onCreate: _createDb);
return notesDatabase;
}
void _createDb(Database db, int newVersion) async {
await db.execute(
'CREATE TABLE $noteTable($colID INTEGER PRIMARY KEY AUTOINCREMENT, $colTitle TEXT, $colDescription TEXT, $colPriority INTEGER, $colDate TEXT)');
}
Future<List<Map<String, dynamic>>> getNoteMapList() async {
Database db = await this.database;
var result = await db.query(noteTable, orderBy: '$colPriority ASC');
return result;
}
Future<int> insertData(Note note) async {
Database db = await this.database;
var result = await db.insert(noteTable, note.toMap());
return result;
}
Future<int> updateNote(Note note) async {
Database db = await this.database;
var result = await db
.update(noteTable, note.toMap(), where: '$colID', whereArgs: [note.id]);
return result;
}
Future<int> deleteNote(int id) async {
Database db = await this.database;
var result =
await db.rawDelete('DELETE FROM $noteTable where $colID = $id');
return result;
}
Future<int> getCount() async {
Database db = await this.database;
List<Map<String, dynamic>> x =
await db.rawQuery('SELECT COUNT (*) FROM $noteTable');
int? result = Sqflite.firstIntValue(x);
return result!;
}
Future<List<Note>> getNoteList() async {
var noteMapList = await getNoteMapList();
int count = noteMapList.length;
}
}
This is the whole code. I have watched many videos but can't understand a thing. The problem starts when I the database part starts. And while answering the questions please try to be a little simple.

Sqlflite - Null check operator used on a null value

I received - Null check operator used on a null value this error while trying to test my sqflite application. Even thought the code is working in emulator. but it didnt passed the test.
Kindly help.
import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
class DbHelper {
static final DbHelper instance = DbHelper._instance();
DbHelper._instance();
static Database? _db;
Future<Database> get db async {
if (_db != null) return db;
_db = await _initDb();
return _db!;
}
Future<Database> _initDb() async {
Directory dir = await getApplicationDocumentsDirectory();
String path = dir.path + '/account_keeper.db';
final accountManagerDb = await openDatabase(
path,
version: 1,
onCreate: _createDb,
);
return accountManagerDb;
}
void _createDb(Database db, int version) async {
// Table 1- BusinessProfile Profile
print('creating db');
print('--create database--');
const String businessProfileTable = 'businessProfile_table';
String businessId = 'id';
String businessName = 'businessName';
await db.execute(
'''
CREATE TABLE
$businessProfileTable(
$businessId INTEGER PRIMARY KEY AUTOINCREMENT,
$businessName TEXTT )''',
);
}
}

Flutter does not run Async function

I am trying to get an async function _read() to run and the function does not pass the line:
Reading reading = await helper.queryReading(rowId); in this function:
_read() async {
DatabaseHelper helper = DatabaseHelper.instance;
int rowId = 1;
//lines above here executes
Reading reading = await helper.queryReading(rowId); //this is the line it stops on
// nothing below here is executed
if (reading == null) {
print('read row $rowId: empty');
} else {
print('read row $rowId: ${reading.reading}');
}
}
It is being called from the following function
class Profile {
Widget getScreen(){
print("Attempting to read db");
_read();
return Scaffold( ...)
Here is my helper class:
import 'dart:ffi';
import 'dart:io';
import 'package:ema/Readings.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
//table structure
final String tableName = 'Readings';
final String databasecolumnId = '_id';
final String databaseReading = 'Reading';
final String databaseDate = 'Time';
class DatabaseHelper {
//This is the name of the database file on disk
static final _databaseName = "readings.db";
//handles versioning for databases
static final _databaseVersion = 1;
//makes a singleton classs
DatabaseHelper._privateConstructor();
static final DatabaseHelper instance = DatabaseHelper._privateConstructor();
//allows only one item to access the database
static Database _database;
Future<Database> get database async {
_database = await _initDatabase();
return database;
}
//this opens and creates the database
_initDatabase() async {
// The path_provider plugin gets the right directory for Android or iOS.
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, _databaseName);
// Open the database. Can also add an onUpdate callback parameter.
return await openDatabase(path,
version: _databaseVersion,
onCreate: _onCreate);
}
//Creates the database
Future _onCreate(Database db, int version) async {
await db.execute(
'''
CREATE TABLE $tableName (
$databasecolumnId INTEGER PRIMARY KEY,
$databaseReading REAL NOT NULL,
$databaseDate INTERGER NOT NULL
)
'''
);
}
Future<int> insertReading(Reading reading) async {
Database db = await database;
int id = await db.insert(tableName, reading.toMap());
return id;
}
//gets reading
Future<Reading> queryReading(int id) async {
print("queryReading"); //gets here
Database db = await database;
print("Getting Db"); // not actually getting here
List<Map> maps = await db.query(tableName,
columns: [databasecolumnId, databaseReading, databaseDate],
where: '$databasecolumnId = ?',
whereArgs: [id]);
if (maps.length > 0) {
return Reading.fromMap(maps.first);
}
print('maps length : ${maps.length}');
return null;
}
}
Here is my Readings class:
class Reading {
int id;
double reading;
DateTime date;
//constructor
Reading({this.id, this.reading, this.date});
Map<String, dynamic> toMap() {
var map = <String, dynamic>{
databaseReading: reading,
databaseDate: date.millisecondsSinceEpoch,
};
if (id != null) {
map[databasecolumnId] = id;
}
return map;
}
//extracts a node object from the map obect
Reading.fromMap(Map<String, dynamic> map) {
id = map[databasecolumnId];
reading = map[databaseReading];
date = new DateTime.fromMillisecondsSinceEpoch(map [databaseDate]);
}
}
Turns out there was a deadlock in getting the database. By putting a lock on it it worked.
Here is the code to resolve it:
///declreation of the database
Database _database;
///Gets the database ensuring that there are no locks currently on the database
Future<Database> get database async {
if (_database != null) return _database;
_database = await _initDatabase();
return _database;
}