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 页面以便它可以使用传入的数据。正如你所看到的,我有一个注释掉的行,我在其中填写了一个 TextView 错误,因为 Coe.Name 不在 Coe 的表模型中。但它在查询中返回。我相信我的问题是 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.htmlOperators标题下:

一元运算符 + 是无操作的。它可以应用于字符串、数字、blob 或 NULL,并且它始终返回与操作数具有相同值的结果。

请注意,等于和不等于运算符有两种变体。等于可以是 = 或 ==。不等于运算符可以是 != 或 <>。|| 运算符是“连接” - 它将其操作数的两个字符串连接在一起。运算符 % 输出其左操作数的值模其右操作数。

任何二元运算符的结果都是数值或 NULL,除了 || 连接运算符始终计算为 NULL 或文本值。

这表明 + 将评估为零。如果您使用 ||,则该值将是正确的值或 NULL(如果 Adult.LName 或 Adult.MName 中的任何一个为 NULL)。这可以通过以下方式解决:

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

但这可能会导致, LastNameor FirstName,。另一种方法是在 Coe 中创建另外两个名为LNameand的属性MName。然后将值绑定到这些属性并使用 Name 属性,如下所示:

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

这可能会更好,因为您可以更改名称的显示方式,特别是如果在不同的地方有不同的名字、中间名和姓氏组合。

和题外话:

我相信我的问题是 IEnumerable ......

这可能不太正确,因为它返回正确的值。更好的方法是使用 IList,因为 IEnumerable 每次都会遍历列表以获取项目,因为它不知道集合实际上是一个列表。(我认为)

于 2012-04-19T07:41:39.583 回答
0

感谢您对合并的帮助,我确实发现这是错误的,我确实解决了我的问题,我正在使用 Greg Shackles 的示例来说明如何使用数据库进行设置。我要做的是用我想要的元素创建一个新模型。所以我创建了一个新模型并将其命名为 CoeList,然后在我有 List 或 IEnumerable 的任何地方我将其更改为 List 或 IEnumerable 并且它工作。

于 2012-04-19T16:47:57.250 回答