2012-04-18 68 views
0

我有一个从适配器填充的列表视图。我的原始代码数据是从表中返回的,但现在我需要从联合查询中获取代码,因此我使用的示例将不再起作用,并且我无法找到如何使用查询为了这。我正在使用一个ORMrepository。 在我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,但我该怎么改变它。我是新手机发展和起诉VS2010单声道

回答

0

问题可能在于对象的绑定/映射而不是创建视图。 或者更具体地说,查询

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

这应该是:

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

参见:String concatenation does not work in SQLite

从SQLite的文档:http://www.sqlite.org/lang_expr.html运营商标题:

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

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

任何二元运算符的结果都是数字值或NULL,除了|| ||以外的其他值都是 。连接运算符总是计算为 NULL或文本值。

这表明+会评估为零。如果使用||,则值将为正确的值或NULL(如果Adult.LName或Adult.MName中的任一个为NULL)。 这可以通过被固定:

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

但是这可能会导致, LastNameFirstName,。 另一种方法是在Coe中创建另外两个名为LNameMName的属性。 然后将值绑定到这些属性,并使用Name属性是这样的:

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

这可能会更好,因为你可以更改名称出现,特别是如果有在第一,中间名和姓的不同组合不同的地方。

而且题外话:

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

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

0

感谢您对concant的帮助,我确实发现这是错误的,我确实修复了我的问题,我正在使用Greg Shackles关于如何使用数据库进行设置的示例。我所要做的就是用我想要的元素创建一个新模型。所以我创建了一个新的模型,并将其称为CoeList,然后将其添加到List或IEnumerable中,我将其更改为List或IEnumerable,并且工作正常。

相关问题