2016-10-20 160 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。

谢谢!