2012-07-20 96 views
22

我正在使用我的自定义ContentProvider与sqlite数据库进行通信。我想显示在一个列表(使用ListFragment),来自两个表(具有多对多关系)的数据。我能想到的唯一解决方案就是使用rawQuery。问题是,如果这是一个好的做法,或者我应该以其他方式解决这个问题?表在ContentProvider中使用rawQuery是一个好习惯吗?

实施例:

表A:ID,COLUMN_FROM_A

表B:ID,COLUMN_FROM_B

加入表AB:重写查询方法的ID,FK_ID_A,FK_ID_B

实施例在ContentProvider中:

@Override 
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 
    Cursor cursor = null; 
    int uriType = URIMatcher.match(uri); 
    switch (uriType) { 
     case TABLE_A_URI: 
      queryBuilder.setTables("TABLE_A"); 
      cursor = queryBuilder.query(databaseHelper.getReadableDatabase(), projection, selection, selectionArgs, null, null, sortOrder); 
      break; 
     case TABLE_B_URI: 
      queryBuilder.setTables("TABLE_B"); 
      cursor = queryBuilder.query(databaseHelper.getReadableDatabase(), projection, selection, selectionArgs, null, null, sortOrder); 
      break; 
     case TABLE_JOIN_A_B_URI: 
      cursor = databaseHelper.getReadableDatabase().rawQuery("select a.COLUMN_FORM_A, b.COLUMN_FROM_B from TABLE_A a, TABLE_B b, TABLE_AB ab where ab.FK_ID_A=a.ID and ab.FK_ID_B=b.ID", null); 
      break; 
     default: 
      throw new IllegalArgumentException("Unknown URI"); 
    } 

    cursor.setNotificationUri(getContext().getContentResolver(), uri); 
    return cursor; 
} 

回答

12

这是一件好事和惯例,在这种情况下非常合适。

我没有预见到任何问题,我们已经在很多应用程序中使用它。

+1

我能想到的唯一更好的解决方案是使用queryBuilder编写这样的查询(使用这个跨表)的方式,而不使用本机SQL,但使用queryBuilder中的查询方法,这在我的示例中用于单个表。我只是没有找到这样的实现,我不知道这是甚至可能的。 – 2012-07-20 12:37:57

+1

也可以,例如'SQLiteQueryBuilder.setTables(“foo LEFT OUTER JOIN bar ON(foo.id = bar.foo_id)”)' – 2012-07-20 14:35:51

+1

以上两个答案都非常满足我。这是我正在寻找的。谢谢。 – 2012-07-23 08:09:32

相关问题