2017-06-21 1 views
1

私はSQLite as a databaseを使用していると私はそれを作成したとき、私は、作品次の表を、持っている:テーブルの作成テーブル内のネストされたクラスとリストを操作するには?

database.CreateTableAsync<TodoItem>().Wait(); 

public class TodoItem 
{ 
    [PrimaryKey, AutoIncrement] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Notes { get; set; } 
    public bool Done { get; set; } 
    public Gender Gender { get; set; } 
    public DateTime? DateOfBirth { get; set; } 
} 

を私はしたい場合、私は、若干の誤差が出ますネストされたオブジェクト含める:

public class Test 
{ 
    [PrimaryKey, AutoIncrement] 
    public int AnotherID { get; set; } 
    public string Name { get; set; } 
} 
public class TodoItem 
{ 
    [PrimaryKey, AutoIncrement] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Notes { get; set; } 
    public bool Done { get; set; } 
    public Gender Gender { get; set; } 
    public DateTime? DateOfBirth { get; set; } 
    public Test Test { get; set; } 
} 

を私は

次のエラーを取得します
UNHANDLED EXCEPTION: 
System.AggregateException: One or more errors occurred. ---> System.NotSupportedException: Don't know about Todo.Test 
    at SQLite.Orm.SqlType (SQLite.TableMapping+Column p, System.Boolean storeDateTimeAsTicks) [0x001ad] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:2080 
    at SQLite.Orm.SqlDecl (SQLite.TableMapping+Column p, System.Boolean storeDateTimeAsTicks) [0x00000] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:2027 
    at SQLite.SQLiteConnection.<CreateTable>m__0 (SQLite.TableMapping+Column p) [0x00000] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:417 
    at System.Linq.Enumerable+SelectArrayIterator`2[TSource,TResult].ToArray() [0x00012] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/external/corefx/src/System.Linq/src/System/Linq/Select.cs:251 
    at System.Linq.Enumerable.ToArray[TSource] (System.Collections.Generic.IEnumerable`1[T] source) [0x00015] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/external/corefx/src/System.Linq/src/System/Linq/ToCollection.cs:19 
    at SQLite.SQLiteConnection.CreateTable (System.Type ty, SQLite.CreateFlags createFlags) [0x00133] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:418 
    at SQLite.SQLiteAsyncConnection+<CreateTablesAsync>c__AnonStorey0.<>m__0() [0x0002f] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLiteAsync.cs:108 
    at System.Threading.Tasks.Task`1[TResult].InnerInvoke() [0x0000f] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/threading/Tasks/Future.cs:680 
    at System.Threading.Tasks.Task.Execute() [0x00010] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/threading/Tasks/Task.cs:2502 
    --- End of inner exception stack trace --- 
    at System.Threading.Tasks.Task.ThrowIfExceptional (System.Boolean includeTaskCanceledExceptions) [0x00011] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/threading/Tasks/Task.cs:2157 
    at System.Threading.Tasks.Task.Wait (System.Int32 millisecondsTimeout, System.Threading.CancellationToken cancellationToken) [0x00043] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/threading/Tasks/Task.cs:3189 
    at System.Threading.Tasks.Task.Wait() [0x00000] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/threading/Tasks/Task.cs:3054 
    at Todo.TodoItemDatabase..ctor (System.String dbPath) [0x00015] in C:\Users\some-user\Documents\Visual Studio 2015\Projects\Todo\Todo\Data\TodoItemDatabase.cs:14 
    at Todo.App.get_Database() [0x0000e] in C:\Users\some-user\Documents\Visual Studio 2015\Projects\Todo\Todo\App.cs:32 
    at Todo.TodoListPage+<OnAppearing>d__1.MoveNext() [0x0002c] in C:\Users\some-user\Documents\Visual Studio 2015\Projects\Todo\Todo\Views\TodoListPage.xaml.cs:20 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:151 
    at System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_0 (System.Object state) [0x00000] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1018 
    at Android.App.SyncContext+<>c__DisplayClass2_0.<Post>b__0() [0x00000] in /Users/builder/data/lanes/4695/448f54fd/source/xamarin-android/src/Mono.Android/Android.App/SyncContext.cs:35 
    at Java.Lang.Thread+RunnableImplementor.Run() [0x00008] in /Users/builder/data/lanes/4695/448f54fd/source/xamarin-android/src/Mono.Android/Java.Lang/Thread.cs:36 
    at Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00008] in /Users/builder/data/lanes/4695/448f54fd/source/xamarin-android/src/Mono.Android/obj/Release/android-23/mcw/Java.Lang.IRunnable.cs:81 
    at (wrapper dynamic-method) System.Object:4ad81135-c1dd-4bba-bca3-4e991f58da69 (intptr,intptr) 
---> (Inner Exception #0) System.NotSupportedException: Don't know about Todo.Test 
    at SQLite.Orm.SqlType (SQLite.TableMapping+Column p, System.Boolean storeDateTimeAsTicks) [0x001ad] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:2080 
    at SQLite.Orm.SqlDecl (SQLite.TableMapping+Column p, System.Boolean storeDateTimeAsTicks) [0x00000] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:2027 
    at SQLite.SQLiteConnection.<CreateTable>m__0 (SQLite.TableMapping+Column p) [0x00000] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:417 
    at System.Linq.Enumerable+SelectArrayIterator`2[TSource,TResult].ToArray() [0x00012] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/external/corefx/src/System.Linq/src/System/Linq/Select.cs:251 
    at System.Linq.Enumerable.ToArray[TSource] (System.Collections.Generic.IEnumerable`1[T] source) [0x00015] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/external/corefx/src/System.Linq/src/System/Linq/ToCollection.cs:19 
    at SQLite.SQLiteConnection.CreateTable (System.Type ty, SQLite.CreateFlags createFlags) [0x00133] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:418 
    at SQLite.SQLiteAsyncConnection+<CreateTablesAsync>c__AnonStorey0.<>m__0() [0x0002f] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLiteAsync.cs:108 
    at System.Threading.Tasks.Task`1[TResult].InnerInvoke() [0x0000f] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/threading/Tasks/Future.cs:680 
    at System.Threading.Tasks.Task.Execute() [0x00010] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/threading/Tasks/Task.cs:2502 <--- 

私はList

public class TodoItem 
{ 
    [PrimaryKey, AutoIncrement] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Notes { get; set; } 
    public bool Done { get; set; } 
    public Gender Gender { get; set; } 
    public DateTime? DateOfBirth { get; set; } 
    public List<string> Strings { get; set; } 
} 

を使用している場合、私はSQLite-net Official Portable Library 1.3.3を使用してい

UNHANDLED EXCEPTION: 
System.AggregateException: One or more errors occurred. ---> System.NotSupportedException: Don't know about System.Collections.Generic.List`1[System.String] 
    at SQLite.Orm.SqlType (SQLite.TableMapping+Column p, System.Boolean storeDateTimeAsTicks) [0x001ad] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:2080 
    at SQLite.Orm.SqlDecl (SQLite.TableMapping+Column p, System.Boolean storeDateTimeAsTicks) [0x00000] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:2027 
    at SQLite.SQLiteConnection.<CreateTable>m__0 (SQLite.TableMapping+Column p) [0x00000] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:417 
    at System.Linq.Enumerable+SelectArrayIterator`2[TSource,TResult].ToArray() [0x00012] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/external/corefx/src/System.Linq/src/System/Linq/Select.cs:251 
    at System.Linq.Enumerable.ToArray[TSource] (System.Collections.Generic.IEnumerable`1[T] source) [0x00015] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/external/corefx/src/System.Linq/src/System/Linq/ToCollection.cs:19 
    at SQLite.SQLiteConnection.CreateTable (System.Type ty, SQLite.CreateFlags createFlags) [0x00133] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:418 
    at SQLite.SQLiteAsyncConnection+<CreateTablesAsync>c__AnonStorey0.<>m__0() [0x0002f] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLiteAsync.cs:108 
    at System.Threading.Tasks.Task`1[TResult].InnerInvoke() [0x0000f] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/threading/Tasks/Future.cs:680 
    at System.Threading.Tasks.Task.Execute() [0x00010] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/threading/Tasks/Task.cs:2502 
    --- End of inner exception stack trace --- 
    at System.Threading.Tasks.Task.ThrowIfExceptional (System.Boolean includeTaskCanceledExceptions) [0x00011] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/threading/Tasks/Task.cs:2157 
    at System.Threading.Tasks.Task.Wait (System.Int32 millisecondsTimeout, System.Threading.CancellationToken cancellationToken) [0x00043] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/threading/Tasks/Task.cs:3189 
    at System.Threading.Tasks.Task.Wait() [0x00000] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/threading/Tasks/Task.cs:3054 
    at Todo.TodoItemDatabase..ctor (System.String dbPath) [0x00015] in C:\Users\some-user\Documents\Visual Studio 2015\Projects\Todo\Todo\Data\TodoItemDatabase.cs:14 
    at Todo.App.get_Database() [0x0000e] in C:\Users\some-user\Documents\Visual Studio 2015\Projects\Todo\Todo\App.cs:32 
    at Todo.TodoListPage+<OnAppearing>d__1.MoveNext() [0x0002c] in C:\Users\some-user\Documents\Visual Studio 2015\Projects\Todo\Todo\Views\TodoListPage.xaml.cs:20 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:151 
    at System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_0 (System.Object state) [0x00000] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1018 
    at Android.App.SyncContext+<>c__DisplayClass2_0.<Post>b__0() [0x00000] in /Users/builder/data/lanes/4695/448f54fd/source/xamarin-android/src/Mono.Android/Android.App/SyncContext.cs:35 
    at Java.Lang.Thread+RunnableImplementor.Run() [0x00008] in /Users/builder/data/lanes/4695/448f54fd/source/xamarin-android/src/Mono.Android/Java.Lang/Thread.cs:36 
    at Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00008] in /Users/builder/data/lanes/4695/448f54fd/source/xamarin-android/src/Mono.Android/obj/Release/android-23/mcw/Java.Lang.IRunnable.cs:81 
    at (wrapper dynamic-method) System.Object:3ff99a1f-7842-4c41-b229-386570e8d19f (intptr,intptr) 
---> (Inner Exception #0) System.NotSupportedException: Don't know about System.Collections.Generic.List`1[System.String] 
    at SQLite.Orm.SqlType (SQLite.TableMapping+Column p, System.Boolean storeDateTimeAsTicks) [0x001ad] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:2080 
    at SQLite.Orm.SqlDecl (SQLite.TableMapping+Column p, System.Boolean storeDateTimeAsTicks) [0x00000] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:2027 
    at SQLite.SQLiteConnection.<CreateTable>m__0 (SQLite.TableMapping+Column p) [0x00000] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:417 
    at System.Linq.Enumerable+SelectArrayIterator`2[TSource,TResult].ToArray() [0x00012] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/external/corefx/src/System.Linq/src/System/Linq/Select.cs:251 
    at System.Linq.Enumerable.ToArray[TSource] (System.Collections.Generic.IEnumerable`1[T] source) [0x00015] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/external/corefx/src/System.Linq/src/System/Linq/ToCollection.cs:19 
    at SQLite.SQLiteConnection.CreateTable (System.Type ty, SQLite.CreateFlags createFlags) [0x00133] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLite.cs:418 
    at SQLite.SQLiteAsyncConnection+<CreateTablesAsync>c__AnonStorey0.<>m__0() [0x0002f] in /Users/fak/Dropbox/Projects/sqlite-net/src/SQLiteAsync.cs:108 
    at System.Threading.Tasks.Task`1[TResult].InnerInvoke() [0x0000f] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/threading/Tasks/Future.cs:680 
    at System.Threading.Tasks.Task.Execute() [0x00010] in /Users/builder/jenkins/workspace/xamarin-android/xamarin-android/external/mono/mcs/class/referencesource/mscorlib/system/threading/Tasks/Task.cs:2502 <--- 

を取得します。 PrimaryKeyForeignKeyなどの属性を使用する必要がありますか?どうやって?あるいは、ライブラリはプリミティブなデータ型しか扱えないのですか?

サンプルはhereからダウンロードできます。

This issueは、Listで動作するはずですが、最新バージョンでは動作しないと述べています。私は1.2.0と1.3.1にダウングレードして成功しなかった。

編集

私は​​をインストールし、

using SQLite; 
using SQLiteNetExtensions.Attributes; 
using System.Collections.Generic; 

namespace Todo 
{ 
    public class Test 
    { 
     [PrimaryKey, AutoIncrement] 
     public int AnotherID { get; set; } 
     public string Name { get; set; } 
    } 

    public class TodoItem 
    { 
     [PrimaryKey, AutoIncrement] 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public string Notes { get; set; } 
     public bool Done { get; set; } 
     [TextBlob("StringsBlobbed")] 
     public List<string> Strings { get; set; } 
     public string StringsBlobbed { get; set; } 
    } 
} 

にサンプルコードを変更し、私はまだ同じエラーを取得します。

編集2

私はライブラリ間の混乱があると思います。 SQLite-Net Extensionsは、SQLite.Net-PCL v. 3.1.1Nuget)に依存します。しかし、Xamarinはライブラリsqlite-net-pcl v. 1.3.3Nuget)にリンクしています。

SQLite.Net-PCLoysteinkrog)がsqlite-net-pclpraeclarum)のフォークです。後者はSQLite-Net Extensionsと互換性がないようですが、これは私がここで必要としているものです。しかし、SQLite.Net-PCLはUWPをサポートしていますか? 2016年6月4日以降更新されていません。最も面白いのは、SQLite-Net Extensionspraeclarumにリンクしていることです。間違っています。私はすべてのSQL Nugetパッケージをアンインストールし、必要な依存関係を自動的に起動するSQLite-Net Extensionsをインストールすることでこれをチェックしました。私に何ができる?

+1

質問に投票しないでください。とにかく私は[ask]を読んで実際のエラーを含めるべきだと思います。 「1つまたは複数のエラーが発生しました」はAggregateExceptionです。これには、InnerExceptionsプロパティで発生した実際の例外が含まれています。これらの例外には、さらに研究できるメッセージが含まれており、あなたの質問にあなたの研究を示すことを忘れないでください。 – CodeCaster

+1

たとえば、[SQLite用のクラスで文字列のリストを使用できますか?](https://stackoverflow.com/questions/14663984/can-i-use-a-list-of-string-in-a)を参照してください。 -class-for-sqlite)を使用します。 – CodeCaster

+0

私は 'SQLiteNetExtensions'を使用しようとしましたが、リストに同じエラーが出ます(編集された質問を参照)。 'ForeignKey'を使ってオブジェクトをオブジェクトに入れ子にすることはできませんか? – testing

答えて

0

ネストして作業するにはListまたはobject私はSQLiteNetExtensionsが必要です。

  1. 手動ソリューション
    1.1にプロジェクトを追加します。私はあなたが2つのオプションがありSQLiteNetExtensionsdefault dependencyよりanother SQLite packageを使用していますので。 SQLiteNetExtensionsのソースをダウンロード
    1.2をダウンロードしてください。プロジェクトに「SQLiteNetExtensions-PCL」をソリューションに追加します
    1.3。すべてのプロジェクトへの参照としてこのプロジェクトを追加します(ポータブル、iOSの、ドロイド、UWP)

  2. Install SQLiteNetExtensions 2.0.0-alpha2

すでにいくつかのSQL NuGetパッケージをインストールしている場合は注意してください。最初にすべてをアンインストールしてから、SQLiteNetExtensionsをインストールしてください。これにより、必要なすべての依存関係が追加されます。あなたが行うことができますList<string>については

public class TodoItem 
{ 
    [PrimaryKey, AutoIncrement] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Notes { get; set; } 
    public bool Done { get; set; } 

    [TextBlob("StringsBlobbed")] 
    public List<string> Strings { get; set; } 
    public string StringsBlobbed { get; set; } 
} 

あなたがリストの他の種類を持っている場合は、[OneToMany]関係を必要とします。あなたはto do thisことができるはずのオブジェクトを操作するには

public class Test 
{ 
    [PrimaryKey, AutoIncrement] 
    public string AnotherID { get; set; } 
    public string Name { get; set; } 
} 

public class TodoItem 
{ 
    [PrimaryKey, AutoIncrement] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Notes { get; set; } 
    public bool Done { get; set; } 

    [ForeignKey(typeof(Test))] 
    public string TestId { get; set; } 

    [OneToOne] 
    public Test Test { get; set; } 
} 

[OneToOne]関係(例えばオブジェクトの場合)で動作するようにどのように良いガイドがthis hereです。 [OneToMany]については、hereをご覧ください。

テーブルを作成し、特殊な方法(GetWithChildrenUpdateWithChildren、...)でデータを取得して保存するなど、いくつかの手順があります。 CascadeOperationsにも注意してください。これは、複数レベルの階層構造を持つ場合に必要になります。

関連する問題