Я работаю с 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;
}
Я использую базу данных только для чтения. Я не пишу ему.