В таблице нет (общедоступных) столбцов только на реальном устройстве
У меня есть самый простой из приложений, которые, как я думал, я попробую на своем устройстве, пока я не увлекся. Тем не менее, я получаю самое странное сообщение об ошибке, когда я запускаю его на своем iPhone (как показано на эмуляторе на моем macbook).
В таблице нет (общедоступных) столбцов.
Я использую SQLite.Net PCL, и я построил его из концентратора git, так как у меня были некоторые проблемы с тем, что у него не было платформы dll для IOS.
Соответствующий код.
В моих моделях у меня есть это:
public class Setting
{
[PrimaryKey, AutoIncrement]
public long Id { get; set; }
[Indexed]
public string Key { get; set; }
public string Value { get; set; }
}
Код, который выдает это сообщение об ошибке, прост:
using (SQLiteConnection db = GetCon ()) {
db.CreateTable<Setting> ();
}
но, на мой взгляд, самое странное, что этот код отлично работает на эмуляторе, но сбой приложения на самом iphone.
Если у кого-то есть идеи, это было бы здорово.
EDIT:
Эта ошибка возникает в библиотеке SQLite.Net-PCL на этом файле строка 380, но только на устройстве, а не на эмуляторе.
Ответы
Ответ 1
Для других, к которым это может относиться, я нашел ответ на свою проблему. Проблема заключалась в том, что Type не имеет никаких свойств (тип, о котором идет речь о классе простой модели). Зная, что это мусор, я нашел следующие ссылки, которые дали больше информации, которую я расскажу в этом сообщении, если ссылки будут мертвыми:
Type.GetProperties не возвращает ничего
ПРИМЕЧАНИЕ. Будьте осторожны с компоновщиком компоновки
Если вы строите с включенным компоновщиком, вам может понадобиться использовать класс где-то, так что он не будет сорван во время компиляции. Иногда, только экземпляров класса в вашем коде недостаточно, компоновщик может обнаружить, что экземпляр никогда не используется и все равно удалит его.
http://developer.xamarin.com/guides/ios/advanced_topics/linker/
Процесс связывания может быть настроен с помощью поведения компоновщика в разделе "Параметры проекта". Чтобы получить доступ к этому двойному щелчку на iOS проект и перейти к iOS Build > Параметры компоновщика, как показано ниже (подробнее см. ссылку)
Теперь я оставил его несвязанным, однако я попробую перед выпуском, чтобы заставить компоновщик игнорировать эти классы. Спасибо за вашу помощь.
Ответ 2
Я обнаружил, что моя проблема - это просто (не такая тонкая) ошибка программирования. Я работал с классом TypeInfo и хотел использовать метод Sqlite Connection:
CreateTable (Type type);
У меня в руке был экземпляр TypeInfo, который мне нужно было преобразовать обратно в System.Type. Я случайно не подумал использовать метод GetType() вместо метода AsType(), что очевидно, когда вы об этом думаете. Ключ, который я получил, был в сообщении об исключении вместе с сообщением OP, было ли у System.Runtime общие свойства?
var type = table.TypeInfo.AsType();
// var type = table.TypeInfo.GetType(); *WRONG*
connection.CreateTable(type);