- Edited
singleChildScrollView
Size SqfLite kullandığım bir helper dosyasını gönderiyorum. Okunaklı ve basit olmasını sağlamaya çalıştım ama takıldığınız yer olursa sorabilirsiniz. Helper singleton olarak tasarlandı.
sqflite: ^1.3.0+1
path_provider: ^1.6.7
Kullanımı
FoodDatabase db = FoodDatabase();
Food iFood =Food(name: "Salata",recipe: "Doğra karıştır",ingredients: "Domates biber soğan");
db.insertFood(iFood);
List<Food> foods = await db.allFoods();
Food aFood = await db.getFood(1);
Food aFood2 = await db.getFoodbyName("Mercimek Çorbası");
aFood2.name="Lahmacun";
db.foodUpdate(aFood2);
import 'dart:async';
import 'dart:io';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
import 'package:step_meter/Models/Food.dart';
class FoodDatabase {
static FoodDatabase _databaseHelper;
static Database _database;
//Sutun adları string olarak tanımlanır
String _foodTableName = 'foods';
String _id = 'id';
String _name = 'name';
String _calorie = 'calorie';
String _ingredients = "ingredients";
String _recipe = "recipe";
String _bakedTime = "bakedTime";
String _fav = "fav";
FoodDatabase._internal();
factory FoodDatabase() {
if (_databaseHelper == null) {
//print("Foods DATA BASE HELPER NULL, OLUSTURULACAK");
_databaseHelper = FoodDatabase._internal();
return _databaseHelper;
} else {
//print("Foods DATA BASE HELPER NULL DEGIL");
return _databaseHelper;
}
}
Future<Database> _getDatabase() async {
if (_database == null) {
//print("Foods DATA BASE NESNESI NULL, OLUSTURULACAK");
_database = await _initializeDatabase();
return _database;
} else {
//print("Foods DATA BASE NESNESI NULL DEĞİL");
return _database;
}
}
Directory klasor;
String sd;
_initializeDatabase() async {
klasor = await getExternalStorageDirectory(); //Cihaz hafızasında uygulamanın kullandığı dosya yolu
sd = klasor.parent.parent.parent.parent.path;//Cihazın ana dizini
String path = join(sd, "MyDirectory", "Foods.db");//Ana dizinde MyDirectory klasörü
if (!await databaseExists(path)) {
try {
await Directory(dirname(path)).create(recursive: true);// klasör yoksa oluşturur.
} catch (_) {}
}
//print("Olusan veritabanının tam yolu : $path");
var foodsDB = await openDatabase(path, version: 1, onCreate: _createDB);//db dosyası varsa açar. Yoksa _createDb tetiklenir ve veritabanı oluşturulur.
return foodsDB;
}
Future _createDB(Database db, int version) async {
//print("CREATE DB METHODU CALISTI TABLO OLUSTURULACAK");
await db.execute(
"CREATE TABLE $_foodTableName ($_id INTEGER PRIMARY KEY AUTOINCREMENT,$_name TEXT, $_ingredients TEXT, $_calorie TEXT ,$_recipe TEXT , $_bakedTime TEXT , $_fav INTEGER)");
//String veri tipleri TEXT olarak belirtilir. Sqflite Bool desteklemez. Bu sebeple INTEGER kullanılır.
}
Future<int> insertFood(Food food) async {
var db = await _getDatabase();
var sonuc = await db.insert(_foodTableName, food.toMap());
return sonuc;
}
Future<List<Food>> allFoods() async {
var db = await _getDatabase();
var sonuc = await db.query(_foodTableName, orderBy: '$_name');
List<Food> foodList = sonuc.map((foodMap) => Food.fromMap(foodMap)).toList();
return foodList;
}
Future<List<Food>> favoriteFoods() async {
var db = await _getDatabase();
var sonuc = await db.query(_foodTableName,
orderBy: '$_name', where: '$_fav = ?', whereArgs: [1]);
List<Food> foodList = sonuc.map((e) => Food.fromMap(e)).toList();
return foodList;
}
Future<Food> getFood(int id) async {
var db = await _getDatabase();
var sonuc = await db.query(_foodTableName,
orderBy: '$_name', where: '$_id = ?', whereArgs: [id]);
var aFood = Food.fromMap(sonuc.first);
return aFood;
}
Future<Food> getFoodbyName(String name) async {
var db = await _getDatabase();
var sonuc = await db.query(_foodTableName,
orderBy: '$_name', where: '$_name = ?', whereArgs: [name]);
var aFood = Food.fromMap(sonuc.first);
return aFood;
}
Future<int> foodUpdate(Food food) async {
var db = await _getDatabase();
var sonuc = db.update(_foodTableName, food.toMap(),
where: '$_id = ?', whereArgs: [food.id]);
return sonuc;
}
Future<int> foodDelete(int id) async {
var db = await _getDatabase();
var sonuc = db.delete(_foodTableName, where: '$_id = ?', whereArgs: [id]);
return sonuc;
}
}
Bu da Food Class
class Food {
int id;
String name;
String calorie;
String ingredients;
String recipe;
String bakedTime;
bool fav;
Food(
{this.id,
this.name,
this.calorie,
this.ingredients,
this.recipe,
this.bakedTime,
this.fav});
Map<String, dynamic> toMap() {
return {
'calorie': calorie,
'name': name,
'ingredients': ingredients,
'recipe': recipe,
'bakedTime': bakedTime,
'fav': fav ? 1 : 0 //sqflite boo desteklemediği için int olarak kaydediyor ve okuyoruz.
};
}
Food.fromMap(Map<String, dynamic> map)
: id = map['id'] ?? 0,
calorie = map['calorie'] ?? "",
name = map['name'] ?? '~Adsız~',
ingredients = map['ingredients'] ?? "",
recipe = map['recipe'] ?? "",
bakedTime = map['bakedTime'],
fav = map['fav'] == 1 ? true : false; //sqflite bool desteklemediği için 1-0 olarak kaydettiğimiz veriyi tekrar bool olarak parse ediyoruz.
}