15

最近、Windows 8 Metro、Windows Phone、およびデスクトップ アプリケーションのクライアントを含む新しいプロジェクトに取り組み始めました。プロジェクト間でViewModelを共有する方が私たちにとってはるかに受け入れられるソリューションであるため、MVVMパターンをメインのアーキテクチャとして使用することにしました。

この目的のためにポータブル クラス ライブラリを使用することにしましたが、問題は、Visualstudio 2012 拡張機能ギャラリーから Windows ランタイム用の SQLite をダウンロードしてインストールした後、適切なライブラリへの参照を追加しようとすると、それらのライブラリがまったく表示されないことです。これは、Portable クラス ライブラリ プロジェクトで SQLite を使用することはできないと思わせます。

たぶん、すでにこれを行っていて、その機能を実現する方法を知っている人もいますか? SQLite を使用し、再利用可能なコードを持つことが開発のこの段階で非常に重要であるため、このタスクを開発する正しい方法を教えてください。

4

4 に答える 4

20

MvvmCrossでは、別のアプローチでこれに取り組みました。

SQLiteのネイティブポートを利用したかったので、 https://github.com/praeclarum/sqlite-net/のSQLite-netORMラッパーを使用したいと思いました。

したがって、PCLだけを使用する代わりに、次のことを行いました。


コードレベルでは、クライアントアプリは次のようなプラグインを使用できます。

ビジネスロジックライブラリ(PCLまたはプラットフォーム固有)では、コードでモデルオブジェクトを定義できます。

public class ListItem
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string Name { get; set; }
    public string WhenCreated { get; set; }
}

起動時にアプリは以下を呼び出すことができます:

  Cirrious.MvvmCross.Plugins.Sqlite.PluginLoader.Instance.EnsureLoaded();
  var factory = this.GetService<ISQLiteConnectionFactory>();
  var connection = factory.Create("SimpleList");
  connection.CreateTable<ListItem>();

次に、操作中に、コードは次のようなことを実行できます。

  connection.Insert(new ListItem() { Name = TextToAdd, WhenCreated = DateTime.Now.ToString("HH:mm:ss ddd MMM yyyy") });

また

 public ListItem this[int index]
 {
     get { return _connection.Table<ListItem>().OrderBy(_sortOrder).Skip(index).FirstOrDefault(); }
 }

UI固有のコードは、プラグインのプラットフォーム固有の拡張機能を参照し、そのプラットフォーム固有の実装をIoC/DIシステムに挿入する必要があります。Droidではこれは本当に簡単です(MonoDroidは実行時にAssembly.Loadをサポートしているため)が、他のプラットフォームでは、これには次のような「ボイラープレート」コードが少し含まれます。

    protected override void AddPluginsLoaders(Cirrious.MvvmCross.Platform.MvxLoaderPluginRegistry loaders)
    {
        loaders.AddConventionalPlugin<Cirrious.MvvmCross.Plugins.Sqlite.WinRT.Plugin>();
        base.AddPluginsLoaders(loaders);
    }

ノート:

  • 現在のMvvmCrossリポジトリにはWinRTとMonoDroidSQLiteラッパーのみが含まれていますが、他のラッパー(WP *とMonoTouch)は簡単に構築できるはずです(他の人がそれらを構築したことは知っていますが、まだ貢献していません)

  • 現在のMvvmCrossリポジトリには、WinRTの同期(非同期ではない)インターフェイスのみが含まれていますが、プライベートプロジェクトでこれを拡張したと言われていることもあります。

  • 私は現在、プラグインをより広く使用できるように、このプラグイン構造をMvvmCrossの外部にプルするプロセスを進めています。うまくいけば、クリスマスの前にこれに関する発表を期待してください。

  • MvvmCrossのプラグインの詳細については、https: //speakerdeck.com/cirrious/mvvmcross-going-portableを参照してください。

于 2012-12-04T16:15:59.710 に答える
2

AutoIncrement および PrimaryKey 属性が次の名前空間からのものであることは、おそらく言及する価値があります。

Cirrious.MvvmCross.Plugins.Sqlite の使用;

  public class Reference : IBusinessEntity

    {

      public string Key { get; set; }

      public string Value { get; set; }



     [PrimaryKey, AutoIncrement]

      public long Id { get; set; }

  }
于 2013-06-09T23:08:04.847 に答える