Xamarin.Forms sqlite-net-pcl не заполняет результат запроса значениями - PullRequest
0 голосов
/ 08 октября 2019

Я работаю с Visual Studio Mac 8.3.2 и Xamarin.Forms 4.2.0, чтобы создать приложение для iOS и Android. В качестве библиотеки интерфейса db я использую sqlite-net-pcl 1.6.292. Я пробовал более старые версии, но результат тот же.

На iOS все работает нормально. Запрос возвращает ожидаемые результаты правильно. На Android я получаю правильное количество записей результатов, но значения результатов всегда равны 0 или пусты.

Здесь какой-то код

public class ewCatAbstract
{
    [PrimaryKey]
    public int id { get; set; }
    public string Name { get; set; }
    public string NoOfObjects { get; set; }
    public string ImageName { get; set; }

    public IEnumerable<ewCatAbstract> GetCategories()
    {
        var fieldName = Globals.dbFieldName(); // returning field name depending on currect language, e.g. nameEng

        var list = Globals.dbConnection.Query<ewCatAbstract>(
            "SELECT ewCat.id, ewCat." + fieldName + " AS Name, COUNT(ewObject2Category.id) AS NoOfObjects, " +
            "CASE WHEN ewCat.id = 2 THEN 'a.png' WHEN ewCat.id = 3 THEN 'b.png' ELSE '?' END AS ImageName " +
            "FROM ewCat, ewObject2Category " +
            "GROUP BY ewCat.id, ewObject2Category.category " +
            "HAVING ewObject2Category.category = ewCat.id " +
            "ORDER BY ewCat.sort");

        // debug code followng
        Console.WriteLine("ewCatAbstract GetCategories: {0} ", list.Count);

        foreach (var element in list)
        {
            Console.WriteLine("mybase: Type is {0}", element.GetType());
            Console.WriteLine("id " + element.id);
            Console.WriteLine("name " + element.Name);
        }

        return list;
    }
}

Количество возвращенных записей правильное. При выполнении цикла я вижу правильный тип класса для каждого возвращаемого элемента, но при печати значений «id» и «Name» «id» всегда равен 0, а строка «Name» всегда является пустой строкой.

Соединение с базой данных может быть открыто. Я не получаю никаких ошибок здесь. В противном случае я не получил бы правильное количество результатов. Обратите внимание: код работает правильно на iOS. Это не работает под Android. Любые идеи будут высоко оценены.

Дополнительная информация: База данных sqlite является предварительно заполненной базой данных. Я скопировал файл базы данных в папку «Активы» и открыл его с помощью следующего кода:

public SQLite.SQLiteConnection CreateConnection()
{
    var sqliteFilename = AppResources.EwAppDatabase; // fetching file name from AppResources
    string documentsDirectoryPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
    var path = Path.Combine(documentsDirectoryPath, sqliteFilename);

    // This is where we copy in our pre-created database
    if (!File.Exists(path))
    {
        using (var binaryReader = new BinaryReader(global::Android.App.Application.Context.Assets.Open(sqliteFilename)))
        {
            using (var binaryWriter = new BinaryWriter(new FileStream(path, FileMode.Create)))
            {
                byte[] buffer = new byte[2048];
                int length = 0;
                while ((length = binaryReader.Read(buffer, 0, buffer.Length)) > 0)
                {
                    binaryWriter.Write(buffer, 0, length);
                }
            }
        }
    }
    var conn = new SQLite.SQLiteConnection(path);

    return conn;
}

Я использую базу данных только для чтения. Я не пишу ему.

...