Ние използваме следното:
- Xamarin 3 (Xamarin Forms)
- MonoTouch
- sqlite.net
- iOS симулатор/хардуер
Приложението синхронизира данни със сървър във фонова нишка. Има само един SQLite обект за връзка, споделен от цялото приложение. Заявките на преден план се изпълняват по същото време, когато се изпълнява фоновото синхронизиране. Всичко това работи добре на Windows 8.1 версия на приложението (т.е. на MSFT Surface и подобни). Въпреки това, след като преминахме към Xamarin/mono, започнахме да получаваме постоянни сривове, както е показано по-долу.
Проучване доведе до тази статия: http://www.aaronheise.com/2012/12/monotouch-sqlite-sigsegv/
Той използва Mono.Data.SqliteClient, а не sqlite.net като нас.
Неговото решение включва изрично изхвърляне на обекти Command, за да се гарантира, че GC може да се справи и т.н. Когато се опитах да обвия моите обекти Command (от sqlite.net) в клауза using(){}, разбрах, че не са за еднократна употреба.
Опитах да вмъкна 100ms закъснения и това спира сривовете, но това не е жизнеспособно решение за нас.
Има ли някаква надежда за sqlite.net тук или трябва да търся друг начин за използване на sqlite?
mono-rt: Stacktrace:
mono-rt: at <unknown> <0xffffffff>
mono-rt: at (wrapper managed-to-native) SQLite.SQLite3.Prepare2 (intptr,string,int,intptr&,intptr) <IL 0x0003c, 0xffffffff>
...
mono-rt:
Native stacktrace:
mono-rt:
Got a SIGSEGV while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries
used by your application.