我正在使用带有多表sqlite数据库的内容提供程序。一些表彼此之间具有一对多的关系。一个表列出实体,第二个表列出活动,通过“外键”引用实体,“外键”是实体的ID。我不使用实际的“外键”,但这是我跟踪的方式。
以下是我的数据库表:
private static final String CREATE_TABLE_ENTITY = "CREATE TABLE " + TABLE_ENTITY + " ( " + ENTITY_KEY_ID + " INTEGER PRIMARY KEY, " + NAME + " TEXT, " + DATE_OBTAINED + " TEXT, " + PROFILE_IMAGE + " TEXT, " + QUALITY1 + " TEXT, " + QUALITY2 + " TEXT, " + QUALITY3 + " TEXT, " + " )" ;
private static final String CREATE_TABLE_ACTIVE_ENTITIES = "CREATE TABLE " + TABLE_ACTIVE_ENTITIES + " ( " + ACTIVE_ENTITY_KEY_ID + " INTEGER PRIMARY KEY, " + TABLE_ENTITY_KEY_ID + " INTEGER, " + NAME + " TEXT, " + DATE + " TEXT, " + ACTIVITY1 + " TEXT, " + ACTIVITY2 + " TEXT, " + ACTIVITY3 + " TEXT, " + ACTIVITY4 + ... + " )" ;
所以我想查询特定实体的结果并获取最新的活动。我尝试在ENTITY_KEY_ID上进行内部联接,这相当于活动表中的TABLE_ENTITY_KEY_ID。
这是我的内容提供商查询:
@Nullable
@Override
public Cursor query(Uri uri, String[] strings, String selection, String[] selectionArgs, String sortOrder) {
db = hdb.getWritableDatabase();
int uriType = uriMatcher.match(uri);
Cursor cursor = null
case TABLE_ENTITY_JOIN_TABLE_ACTIVE_ENTITIES_ID:
if (uri != null) {
String[] args = {uri.getLastPathSegment()
cursor = db.rawQuery("SELECT table_entity.NAME, date_obtained, profile_image, quality1, quality2, quality3, table_active_entities.activity1, table_active_entities.activity2 " + " FROM table_entity, table_active_entities " + " ON ENTITY_KEY_ID = table_entity_key_id " + " WHERE ENTITY_KEY_ID=?", args);
}
break;
default:
throw new IllegalArgumentException("Unknown Uri");
}
if (cursor != null) {
cursor.setNotificationUri(getContext().getContentResolver(), uri);
}
return cursor;
}
这是我从我的活动中调用查询的地方:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hermit_page);
getInfoIntent = getIntent();
uri = getInfoIntent.getParcelableExtra(MyProvider.CONTENT_ITEM_TYPE);
getSupportLoaderManager().initLoader(0,null,this);
action = Intent.ACTION_ATTACH_DATA;
EntityDataFilter = MyDatabaseHelper.ENTITY_KEY_ID + " = " + uri.getLastPathSegment();
long id = Long.parseLong(uri.getLastPathSegment());
Cursor cursor = getContentResolver().query(ContentUris.withAppendedId(MyProvider.CONTENT_URI_TABLE_ENTITY_JOIN_TABLE_ACTIVE_ENTITIES, id),null, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
name = cursor.getString(cursor.getColumnIndex(MyDatabaseHelper.NAME));
hImage = cursor.getString(cursor.getColumnIndex(MyDatabaseHelper.PROFILE_IMAGE));
...
cursor.close();
}
我遇到的问题是WHERE子句,它选择ID不会拉起行。如果我放了cursor.moveToFirst(),或者如果我把cursor.moveToLast()放到ENTITY表的最后一个ID,我要么得到ENTITY表的第一个ID的结果。我没有从ENTITY TABLE获取联接中的信息。它与实际选择的ENTITY_ID无关。所以似乎WHERE子句不是按ID过滤的。我尝试在活动中的查询语句中添加参数(使用EntityDataFilter字符串),但这不会在结果中产生任何差异。我还尝试将select查询作为字符串编写,然后在内容提供程序查询中插入字符串,如:cursor.db.RawQuery(MyStringQuery,args),但这也不起作用。我通过查看我的活动中的TextView结果来跟踪输出。如果您理解为什么会给出这些结果以及如何更好地编写语句以获得我想要的结果,那么非常感谢您的帮助。非常感谢你提前!