#sql #database #flutter #dart #sqflite
Вопрос:
Я надеюсь, что у вас все хорошо !
Я столкнулся с проблемой, связанной с моим приложением Flutter : я следил за учебником на Youtube о том, как использовать sqflite во Flutter, и я не смог заставить свою функцию toMap работать в моем классе базы данных… Он всегда возвращает мне ошибку «Элемент экземпляра», к которому» невозможно получить доступ с помощью статического доступа». Кто-нибудь знает, в чем дело? Я действительно этого не понимаю… Заранее спасибо!!
Ниже, проблемный код :
poi.дротик
final String tablePOI = 'poi';
class POIFields {
static final String id = '_id';
static final String email = 'email';
static final String village = 'village';
static final String lieu = 'lieu';
static final String type = 'type';
static final String etat = 'etat';
static final String notes = 'notes';
static final String latitude = 'latitude';
static final String longitude = 'longitude';
static final String imageUrl = 'image_url';
}
class POI {
final int id;
final String email;
final String village;
final String lieu;
final String type;
final String etat;
final String notes;
final String latitude;
final String longitude;
final String imageUrl;
POI({this.id, this.email, this.village, this.lieu, this.type, this.etat, this.notes, this.latitude, this.longitude, this.imageUrl});
Map<String, Object> toMap() => {
POIFields.id: id,
POIFields.email: email,
POIFields.village: village,
POIFields.lieu: lieu,
POIFields.type: type,
POIFields.etat: etat,
POIFields.notes: notes,
POIFields.latitude: latitude,
POIFields.longitude: longitude,
POIFields.imageUrl: imageUrl,
};
String toString() {
return 'POI{id: $id, email: $email, village: $village, lieu: $lieu, type: $type, etat: $etat, notes: $notes, latitude: $latitude, longitude: $longitude, image_url: $imageUrl}';
}
}
poi_db.дротик
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'package:stage_app_mpc/models/poi.dart';
class POIDatabase {
static final POIDatabase instance = POIDatabase._init();
static Database _database;
POIDatabase._init();
Future<Database> get database async {
if (_database != null) {
return _database;
}
else {
_database = await _initDB('poi.db');
return _database;
}
}
Future<Database> _initDB(String filePath) async {
final dbPath = await getDatabasesPath();
final path = join(dbPath, filePath);
return openDatabase(path, version: 1, onCreate: _createDB);
}
Future _createDB(Database db, int version) async {
await db.execute('CREATE TABLE poi (id INTEGER PRIMARY KEY, email TEXT, village TEXT, lieu TEXT, type TEXT, etat TEXT, notes TEXT, latitude TEXT, longitude TEXT, image_url TEXT)');
}
Future<POI> create(POI poi) async {
final db = await instance.database;
final id = await db.insert('poi', POI.toMap());
}
Future closeDB() async {
final db = await instance.database;
db.close();
}
}
Ответ №1:
Вы ссылаетесь на класс POI
, а не на параметр poi
:
Future<POI> create(POI poi) async {
final db = await instance.database;
final id = await db.insert('poi', POI.toMap());
}
Вы должны изменить его, чтобы ссылаться на параметр, который вы передаете.
Future<POI> create(POI poi) async {
final db = await instance.database;
final id = await db.insert('poi', poi.toMap());
}
ПРИМЕЧАНИЕ: Я бы предложил, чтобы избежать такой путаницы в будущем, называть свои классы с меньшим количеством сокращений. Это помогает назвать их как можно более описательно. Затем для отдельных переменных вы можете использовать сокращенную нотацию (хотя я бы все равно попытался описать, как она используется).
В этом случае, что означает POI: Достопримечательность?
class PlaceOfInterest {...}
Тогда вашим параметром или полем может быть currentPoi
, activePoi
, poiData
, и т.д…