0

アダプターから入力するリストビューがあります。私の元のコードはデータがテーブルから返されていましたが、結合を使用してクエリからコードを取得する必要があるため、使用した例は機能しなくなり、クエリの使用方法を見つけることができませんでしたこのため。私はORMリポジトリを使用しています。私のORMrepositoryには、この機能があります

        public IList<Coe> GetmyCoe()
    {
      using (var database = new SQLiteConnection(_helper.WritableDatabase.Path))
      {
        string query = "SELECT Coe.Id, Adult.LName + ',  ' + Adult.MName AS Name, Coe.Createdt FROM Adult INNER JOIN Coe ON Adult.CoeMID = Coe.Id";
        return database.Query<Coe>(query);
      }
    }

実際に必要なデータを返します。次に、アクティビティページにこれがあります。

  _list = FindViewById<ListView>(Resource.Id.List);
  FindViewById<ListView>(Resource.Id.List).ItemClick += new System.EventHandler<ItemEventArgs>(CoeList_ItemClick);

   var Coe = ((OmsisMobileApplication)Application).OmsisRepository.GetmyCoe();
  _list.Adapter = new CoeListAdapter(this, Coe);

私のアダプタページは私が問題を抱えている場所です.私はもうやっていないテーブルを見るように設定されていることを知っています. しかし、私が今渡しているものを変更する方法がわかりません。現在の CoeListAdapter は次のとおりです。

    public class CoeListAdapter : BaseAdapter
{
  private IEnumerable<Coe> _Coe;
    private Activity _context;

    public CoeListAdapter(Activity context, IEnumerable<Coe> Coe)
    {
      _context = context;
      _Coe = Coe;
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        var view = (convertView
            ?? _context.LayoutInflater.Inflate(
                Resource.Layout.CoeListItem, parent, false)
                ) as LinearLayout;
        var Coe = _Coe.ElementAt(position);
        view.FindViewById<TextView>(Resource.Id.CoeMID).Text = Coe.Id.ToString();
        //view.FindViewById<TextView>(Resource.Id.GrdnMaleName).Text = Coe.Name;
        view.FindViewById<TextView>(Resource.Id.CreateDt).Text = Coe.CreateDt;
        return view;
    }

    public override int Count
    {
      get { return _Coe.Count(); }
    }

    public Coe GetCoe(int position)
    {
      return _Coe.ElementAt(position);
    }

    public override Java.Lang.Object GetItem(int position)
    {
        return null;
    }

    public override long GetItemId(int position)
    {
        return position;
    }
}

渡されたデータを使用できるように CoeListAdapter.cs ページを設定するにはどうすればよいですか。ご覧のとおり、Coe.Name が Coe のテーブル モデルにないため、TextView にエラーが発生するコメント アウトされた行があります。ただし、クエリで返されます。私の問題は IEnumerable だと思いますが、何に変更すればよいですか。私はモバイル開発に不慣れで、Mono 用に VS2010 を訴えています

4

2 に答える 2

0

問題はおそらく、ビューの作成ではなく、オブジェクトのバインド/マッピングにあります。または、おそらくより具体的には、クエリ

 Adult.LName + ',  ' + Adult.MName AS Name

これは次のようになります。

Adult.LName || ',  ' || Adult.MName AS Name 

参照:文字列の連結はSQLiteでは機能しません

sqliteドキュメントから:演算子の見出しの下のhttp://www.sqlite.org/lang_expr.html :

単項演算子+は何もしません。文字列、数値、blob、またはNULLに適用でき、常にオペランドと同じ値の結果を返します。

equals演算子とnotequals演算子には2つのバリエーションがあることに注意してください。等しいは、=または==のいずれかになります。等しくない演算子は、!=または<>のいずれかです。|| 演算子は「連結」です-オペランドの2つの文字列を結合します。演算子%は、右のオペランドを法として左のオペランドの値を出力します。

||を除いて、二項演算子の結果は数値またはNULLのいずれかになります。常にNULLまたはテキスト値のいずれかに評価される連結演算子。

これは、+がゼロと評価されることを示しています。||を使用する場合、値は正しい値またはNULLになります(Adult.LNameまたはAdult.MNameのいずれかがNULLの場合)。これは次の方法で修正できます。

coalesce(first, '') || ', ' || coalesce(second, '') 

ただし、これにより, LastNameまたはが発生する可能性がありFirstName,ます。別の方法は、とと呼ばれるCoeに別の2つのプロパティを作成することLNameですMName。次に、値をそれらのプロパティにバインドし、次のようにNameプロパティを使用します。

public string Name
{
    get { return string.Join(", ", LName, MName); }
}

異なる場所にファーストネーム、ミドルネーム、ラストネームの組み合わせが異なる場合は特に、名前の表示方法を変更できるため、これはおそらくより良いでしょう。

そしてトピック外:

私の問題はIEnumerableだと思います...

正しい値を返すので、これはおそらくあまり真実ではありません。IEnumerableはコレクションが実際にリストであることを認識していないため、アイテムを取得するたびにリストを反復処理するため、IListを使用するのがより良い方法です。(おもう)

于 2012-04-19T07:41:39.583 に答える
0

連結の助けに感謝します。それが間違っていることがわかりました。問題を修正しました。データベースを使用してセットアップする方法について、Greg Shackles の例を使用していました。私がしなければならなかったのは、私が欲しかった要素を備えた新しいモデルを作成することでした. そこで、新しいモデルを作成してそれを CoeList と呼び、List または IEnumerable を持っていたすべての場所を List または IEnumerable に変更すると、機能しました。

于 2012-04-19T16:47:57.250 に答える