Tracking funkció fejlesztése

This commit is contained in:
2026-06-11 01:20:55 +02:00
parent 2364b2311c
commit 01e6105240
18 changed files with 858 additions and 162 deletions
+13 -123
View File
@@ -1,5 +1,4 @@
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart' as p;
import 'package:terepi_seged/services/app_database.dart';
import '../models/track.dart';
/// SQLite adatbázis-réteg a nyomvonalakhoz.
@@ -8,125 +7,16 @@ class TrackDatabase {
TrackDatabase._();
static final instance = TrackDatabase._();
static Database? _db;
Future<Database> get database async {
_db ??= await _open();
return _db!;
}
Future<Database> _open() async {
final dbPath = p.join(await getDatabasesPath(), 'tracks.db');
return openDatabase(
dbPath,
version: 1,
onCreate: _onCreate,
);
}
Future<void> _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE tracks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
start_time TEXT NOT NULL,
end_time TEXT,
status TEXT NOT NULL DEFAULT 'recording',
source TEXT NOT NULL DEFAULT 'Telefon GPS',
distance_meters REAL NOT NULL DEFAULT 0,
point_count INTEGER NOT NULL DEFAULT 0
)
''');
await db.execute('''
CREATE TABLE track_points (
id INTEGER PRIMARY KEY AUTOINCREMENT,
track_id INTEGER NOT NULL REFERENCES tracks(id) ON DELETE CASCADE,
latitude REAL NOT NULL,
longitude REAL NOT NULL,
altitude REAL,
accuracy REAL,
speed REAL,
heading REAL,
timestamp TEXT NOT NULL
)
''');
await db.execute(
'CREATE INDEX idx_tp_track ON track_points(track_id, timestamp)');
}
// ─── Tracks CRUD ───────────────────────────────────────────────────────────
Future<int> insertTrack(Track track) async {
final db = await database;
return db.insert('tracks', track.toMap());
}
Future<void> updateTrack(Track track) async {
final db = await database;
await db.update('tracks', track.toMap(),
where: 'id = ?', whereArgs: [track.id]);
}
Future<void> deleteTrack(int id) async {
final db = await database;
await db.delete('tracks', where: 'id = ?', whereArgs: [id]);
}
Future<List<Track>> listTracks() async {
final db = await database;
final rows = await db.query('tracks', orderBy: 'start_time DESC');
return rows.map(Track.fromMap).toList();
}
Future<Track?> getTrack(int id) async {
final db = await database;
final rows =
await db.query('tracks', where: 'id = ?', whereArgs: [id], limit: 1);
return rows.isEmpty ? null : Track.fromMap(rows.first);
}
// ─── TrackPoints ───────────────────────────────────────────────────────────
/// Egyetlen pont hozzáadása + track statisztikák atomi frissítése.
Future<void> addPoint(TrackPoint point, double newDistance) async {
final db = await database;
await db.transaction((txn) async {
await txn.insert('track_points', point.toMap());
await txn.rawUpdate('''
UPDATE tracks
SET distance_meters = ?,
point_count = point_count + 1
WHERE id = ?
''', [newDistance, point.trackId]);
});
}
Future<List<TrackPoint>> getPoints(int trackId) async {
final db = await database;
final rows = await db.query(
'track_points',
where: 'track_id = ?',
whereArgs: [trackId],
orderBy: 'timestamp ASC',
);
return rows.map(TrackPoint.fromMap).toList();
}
/// Csak a koordinátákat adja vissza — a térkép polyline-hoz elég.
Future<List<({double lat, double lon})>> getLatLons(int trackId) async {
final db = await database;
final rows = await db.query(
'track_points',
columns: ['latitude', 'longitude'],
where: 'track_id = ?',
whereArgs: [trackId],
orderBy: 'timestamp ASC',
);
return rows
.map((r) =>
(lat: r['latitude'] as double, lon: r['longitude'] as double))
.toList();
}
// Minden hívás az AppDatabase-re delegál
Future<int> insertTrack(Track t) => AppDatabase.instance.insertTrack(t);
Future<void> updateTrack(Track t) => AppDatabase.instance.updateTrack(t);
Future<void> deleteTrack(int id) => AppDatabase.instance.deleteTrack(id);
Future<List<Track>> listTracks() => AppDatabase.instance.listTracks();
Future<Track?> getTrack(int id) => AppDatabase.instance.getTrack(id);
Future<void> addPoint(TrackPoint p, double d) =>
AppDatabase.instance.addPoint(p, d);
Future<List<TrackPoint>> getPoints(int id) =>
AppDatabase.instance.getPoints(id);
Future<List<({double lat, double lon})>> getLatLons(int trackId) =>
AppDatabase.instance.getLatLons(trackId);
}