2016-10-20 158 views
0

我正在用Xamarin.Forms和Portable Class Library構建應用程序。該應用程序可以在Android,iOS和UWP上使用。
我一直在構建一個現在適用於Android和UWP的數據庫。當我使用相同的代碼並在iOS上運行它時,會出現一些錯誤。Xamarin.iOS SQLiteException:損壞

這是異常消息:

未處理的異常:SQLite.SQLiteException:損壞

這是堆棧跟蹤:

在SQLite.PreparedSqlLiteInsertCommand.ExecuteNonQuery(系統。 Object [] source)[0x00116]位於/Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:2480 位於SQLite.SQLiteConnection.Insert(System.Obje ct obj,System.String extra,System.Type objType)[0x0010e]在/Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:1381 ---從以前位置的堆棧跟蹤結束,其中異常拋出--- 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()[0x0000c]在/ Users/builder/data/lanes/3818/ad1cd42d/source/xamarin-macios/_ios-build/Library/Frameworks/Xamarin .iOS.framework/Versions/git/src/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks。任務任務)/Users/builder/data/lanes/3818/ad1cd42d/source/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/mcs/中的[0x00047] class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 at System.Runtime.Co在/Users/builder/data/lanes/3818/ad1cd42d/source/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS中的mpilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task任務)[0x0002e]。在System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(System.Threading.Tasks.Task任務)上的框架/版本/ git/src/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 [0x0000b]在/Users/builder/data/lanes/3818/ad1cd42d/source/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/mcs/class/referencesource /mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 at/Users/builder/data/lanes/3818/ad1cd42d/source System.Runtime.CompilerServices.TaskAwaiter`1 [TResult] .GetResult()[0x00000] /xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/mcs/class/referencesource/mscorlib/system/runtim E/compilerservices/TaskAwaiter.cs:357 在App2.Model.Database.FormDAO + d__2.MoveNext()[0x00066]在d:\ SourceTree \ App2的\ App2的\模型\數據庫\ FormDAO.cs:25

這就是未處理的異常是代碼:

public async void InsertItem(Form Form) 
{ 
    try 
    { 
     var result = await Task.Factory.StartNew(() => database.Insert(Form)); //this line 
    } catch(Exception e) 
    { 
     Debug.WriteLine("e.message" + e.Message + ";;;;" + e.StackTrace); 
    } 
} 

函數InsertItem(形式)被稱爲從另一異步方法約1000倍。

爲什麼此代碼無法在iOS上使用?

編輯: 其他錯誤我得到的是:

的SQLite。SQLiteException:IO錯誤

堆棧跟蹤:

在SQLite.PreparedSqlLiteInsertCommand.ExecuteNonQuery(System.Object的[]源)[0x00116]在/用戶/ FAK /升降梭箱/項目/源碼網/ SRC/SQLite.cs:2480 位於/Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs中的SQLite.SQLiteConnection.Insert(System.Object obj,System.String extra,System.Type objType)[0x0010e] :1381 ---從之前的位置拋出異常的堆棧跟蹤結束---在/ Users/builder/data/lanes/381中System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()[0x0000c]處的 8/ad1cd42d /源極/ xamarin-macios/_ios-構建/庫/框架/ Xamarin.iOS.framework /版本/ GIT中/ SRC /單聲道/ MCS /類/ referencesource/mscorlib程序/系統/運行/ exceptionservices/exceptionservicescommon.cs: 143 at/Users/builder/data/lanes/3818/ad1cd42d/source/xamarin-macios/_ios-build/Library中的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task任務)[0x00047] /Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System。 Threading.Tasks.Task任務)/Users/builder/data/lanes/3818/ad1cd42d/source/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/中的[0x0002e] mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(System.Threading.Tasks.Task任務)在/ Users/builder/data/lanes/3818/ad1cd42d/source/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 at System.Runtime.CompilerServices.TaskAwaiter`1 [TResult] .GetResult( )/Users/builder/data/lanes/3818/ad1cd42d/source/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/mcs/class/中的[0x00000] D:\ SourceTree \ App2 \ App2 \ Model \ Database \ CourseDAO.cs中的App2.Model.Database.CourseDAO + d__2.MoveNext()[0x00055]中的referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:357 :26

T他的異常使用幾乎同樣的方法,當扔但隨後這一行:

var result = await Task.Factory.StartNew(() => database.Insert(Course)); 
+1

'數據庫磁盤映像格式錯誤:嘗試從設備/模擬器手動刪除應用程序以刪除數據庫並重試。您可能想要通過隊列來查看序列化數據庫操作,並在不同任務/線程上預先執行這些插入操作。 – SushiHangover

+0

@SushiHangover你有通過隊列序列化數據庫操作的例子嗎? – 476rick

+1

使用ConcurrentQueue添加您的「課程」。創建一個試圖從隊列中獲取對象並插入到數據庫的任務。該任務將把寫入序列化爲數據庫。使寫入隊列異步但不寫入數據庫異步。 –

回答

0

的問題是異步調用到數據庫尤里小號SushiHangover在評論中指出。

首先,我沒有想到問題是對數據庫的異步調用,因爲它在Android和UWP上工作。但是當我使所有的調用同步時,數據庫在所有三個平臺上都可以工作:UWP,Android,iOS。

謝謝!