Initial commit: FieldLogger MAUI app with Maglink BLE support
Added Maglink RTK GNSS receiver integration with correct BLE UUIDs and device name filtering (ML-* prefix). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
90
FieldLogger/Services/Data/AppDatabase.cs
Normal file
90
FieldLogger/Services/Data/AppDatabase.cs
Normal file
@@ -0,0 +1,90 @@
|
||||
using FieldLogger.Models;
|
||||
using SQLite;
|
||||
|
||||
namespace FieldLogger.Services.Data;
|
||||
|
||||
/// <summary>Local SQLite store for jobs and logged points.</summary>
|
||||
public sealed class AppDatabase
|
||||
{
|
||||
private readonly Lazy<Task<SQLiteAsyncConnection>> _connection;
|
||||
|
||||
public AppDatabase()
|
||||
{
|
||||
_connection = new Lazy<Task<SQLiteAsyncConnection>>(async () =>
|
||||
{
|
||||
var path = Path.Combine(FileSystem.AppDataDirectory, "fieldlogger.db3");
|
||||
var db = new SQLiteAsyncConnection(path,
|
||||
SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create | SQLiteOpenFlags.SharedCache);
|
||||
await db.CreateTableAsync<Job>();
|
||||
await db.CreateTableAsync<LoggedPoint>();
|
||||
return db;
|
||||
});
|
||||
}
|
||||
|
||||
private Task<SQLiteAsyncConnection> Db => _connection.Value;
|
||||
|
||||
// ---- Jobs ----
|
||||
|
||||
public async Task<List<Job>> GetJobsAsync()
|
||||
{
|
||||
var db = await Db;
|
||||
return await db.Table<Job>().OrderByDescending(j => j.CreatedUtc).ToListAsync();
|
||||
}
|
||||
|
||||
public async Task<Job?> GetJobAsync(int id)
|
||||
{
|
||||
var db = await Db;
|
||||
return await db.Table<Job>().Where(j => j.Id == id).FirstOrDefaultAsync();
|
||||
}
|
||||
|
||||
public async Task<Job> CreateJobAsync(string name, string notes = "")
|
||||
{
|
||||
var db = await Db;
|
||||
var job = new Job { Name = name, Notes = notes };
|
||||
await db.InsertAsync(job);
|
||||
return job;
|
||||
}
|
||||
|
||||
public async Task UpdateJobAsync(Job job)
|
||||
{
|
||||
var db = await Db;
|
||||
await db.UpdateAsync(job);
|
||||
}
|
||||
|
||||
public async Task DeleteJobAsync(int jobId)
|
||||
{
|
||||
var db = await Db;
|
||||
await db.Table<LoggedPoint>().DeleteAsync(p => p.JobId == jobId);
|
||||
await db.DeleteAsync<Job>(jobId);
|
||||
}
|
||||
|
||||
// ---- Points ----
|
||||
|
||||
public async Task<int> AddPointAsync(LoggedPoint point)
|
||||
{
|
||||
var db = await Db;
|
||||
await db.InsertAsync(point);
|
||||
return point.Id;
|
||||
}
|
||||
|
||||
public async Task<List<LoggedPoint>> GetPointsAsync(int jobId)
|
||||
{
|
||||
var db = await Db;
|
||||
return await db.Table<LoggedPoint>()
|
||||
.Where(p => p.JobId == jobId)
|
||||
.OrderBy(p => p.TimestampUtc)
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
public async Task<int> GetPointCountAsync(int jobId)
|
||||
{
|
||||
var db = await Db;
|
||||
return await db.Table<LoggedPoint>().Where(p => p.JobId == jobId).CountAsync();
|
||||
}
|
||||
|
||||
public async Task DeletePointAsync(int pointId)
|
||||
{
|
||||
var db = await Db;
|
||||
await db.DeleteAsync<LoggedPoint>(pointId);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user