Использование любого из пакетов NuGet: SQLite.Net-PCL — платформа Win32, SQLite.Net-PCL — платформа XamarinIOS или платформа SQLite.Net-PCL XamarinAndroid У меня вообще проблемы с выбором. В частности, всякий раз, когда я выбираю из базы данных либо в LINQ, либо в необработанном SQL, я возвращаю то, что кажется объектом, содержащим значения по умолчанию.
Вот пример консольного приложения для демонстрации моей проблемы:
using System;
using System.Linq;
using SQLite.Net;
using SQLite.Net.Platform.Win32;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// Open a connection to the database
using (var database = new SQLiteConnection(new SQLitePlatformWin32(), "db.db"))
{
// Create a simple table
database.CreateTable<Entity>();
// Add a simple record to it each time we start the application
database.Insert(new Entity { Data = Guid.NewGuid().ToString(), BoolData = true, IntData = 5 });
Console.WriteLine("---------> Inserted item:");
// Display all our records
foreach (var e in database.Table<Entity>())
{
Console.WriteLine(e);
}
Console.WriteLine(Environment.NewLine);
Console.WriteLine("---------> Linq select Ids:");
// For every record we'll select the Id field - this is not working
foreach (var e in database.Table<Entity>().Select(e => e.Id))
{
Console.WriteLine(e);
}
Console.WriteLine(Environment.NewLine);
Console.WriteLine("---------> Id by scalar query:");
// Let's try going after a value explicitly - this is fine
var r1 = database.ExecuteScalar<int>("SELECT Id FROM Entity WHERE Id == 1");
Console.WriteLine(r1);
Console.WriteLine(Environment.NewLine);
Console.WriteLine("---------> Ids by query:");
// So lets try going after our Id field from a query - this still dosen't work
foreach (var e in database.Query<int>("SELECT Id FROM Entity"))
{
Console.WriteLine(e);
}
Console.WriteLine(Environment.NewLine);
Console.WriteLine("---------> Linq select Ids after force to memory:");
// Now lets try forcing a where to execute before performing the select - this works but it's bad
foreach (var e in database.Table<Entity>().Where(e => e.IntData == 5).ToList().Select(e => e.Id))
{
Console.WriteLine(e);
}
Console.ReadKey();
}
}
}
}
Entity — это просто POD:
using SQLite.Net.Attributes;
namespace ConsoleApplication1
{
public class Entity
{
public Entity() { }
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public string Data { get; set; }
public int IntData { get; set; }
public bool BoolData { get; set; }
public override string ToString()
{
return string.Format("Id: {0}, Data: {1}, IntData: {2}, BoolData: {3}", Id, Data, IntData, BoolData);
}
}
}
Таким образом, единственный способ, которым я смог заставить его работать, - это сначала принудительно указать место в памяти ... это плохо в случае, когда у нас могут быть данные, содержащие BLOB и т. д., которые нас не интересуют.
Это поведение преднамеренное или я что-то пропустил?