Tracking funkció fejlesztése
This commit is contained in:
@@ -24,7 +24,12 @@ class AppDatabase {
|
||||
}
|
||||
|
||||
final directory = await getExternalStorageDirectory();
|
||||
final path = p.join(directory!.path, 'database', 'terepi_seged.db');
|
||||
final dbDir = Directory(p.join(directory!.path, 'database'));
|
||||
|
||||
if (!await dbDir.exists()) {
|
||||
await dbDir.create(recursive: true);
|
||||
}
|
||||
final path = p.join(dbDir.path, 'terepi_seged.db');
|
||||
|
||||
return openDatabase(path,
|
||||
version: 1, onCreate: _onCreate, onUpgrade: _onUpgrade);
|
||||
@@ -74,7 +79,7 @@ class AppDatabase {
|
||||
await db.execute('''
|
||||
CREATE TABLE IF NOT EXISTS tracks (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
project_id INTEGER NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
||||
project_id INTEGER REFERENCES projects(id) ON DELETE CASCADE,
|
||||
name TEXT NOT NULL,
|
||||
start_time TEXT NOT NULL,
|
||||
end_time TEXT,
|
||||
@@ -248,15 +253,20 @@ class AppDatabase {
|
||||
|
||||
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('''
|
||||
try {
|
||||
await db.transaction((txn) async {
|
||||
await txn.insert('track_points', point.toMap());
|
||||
await txn.rawUpdate('''
|
||||
UPDATE tracks
|
||||
SET distance_meters = ?,
|
||||
SET distance_m = ?,
|
||||
point_count = point_count + 1
|
||||
WHERE id = ?
|
||||
''', [newDistance, point.trackId]);
|
||||
});
|
||||
});
|
||||
} catch (e) {
|
||||
print(
|
||||
'addPoint hiba: $e - trackId=${point.trackId} dist=$newDistance');
|
||||
}
|
||||
}
|
||||
|
||||
Future<List<TrackPoint>> getPoints(int trackId) async {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user