0

データベースを操作する ContentProvider を作成しています。このデータベースには、「旅行」テーブルと「日」テーブルがあります。trip テーブルの各レコードは、day テーブルの複数のレコードに関連付けられています。つまり、各トリップは複数の日にまたがりますが、1 日のレコードは 1 つのトリップにのみ属することができます。旅行が削除された場合、それに関連付けられているすべての日も削除する必要があります。

私の質問はこれです。削除時に ContentProvider からこのテーブルの関係を処理する標準または一般的に受け入れられている方法は何ですか? delete メソッドが特定の旅行を削除するための URI を取得した場合、関連する日も削除する必要がありますか?それとも単に旅行を削除し、ContentProvider を使用して日を削除するために必要なロジックをプログラムに実行させる必要がありますか?

一度にすべてを削除します。削除するトリップ ID を使用してアプリから 1 つの呼び出しを行います。

@Override
public int delete( Uri uri, String selection, String[] selectionArgs )
{
    SQLiteDatabase db;
    int count;

    db = _dbHelper.getWritableDatabase();
    switch( uriMatcher.match( uri ) )
    {
        case TRIP_ID:
            count = db.delete( TRIP_TABLE, KEY_TRIP_ID + "=?", new String[]{ uri.getLastPathSegment() } );
            count += db.delete( DAY_TABLE, KEY_TRIP_ID + "=?", new String[]{ uri.getLastPathSegment() } );
            return count;
    }
}

または、要求されたものだけを正確に削除し、旅行と必要な日数でアプリから複数の通話を削除します。

@Override
public int delete( Uri uri, String selection, String[] selectionArgs )
{
    SQLiteDatabase db;
    int count;

    db = _dbHelper.getWritableDatabase();
    switch( uriMatcher.match( uri ) )
    {
        case TRIP_ID:
            count = db.delete( TRIP_TABLE, KEY_TRIP_ID + "=?", new String[]{ uri.getLastPathSegment() } );
            return count;
        case Day_ID:
            count = db.delete( DAY_TABLE, KEY_DAY_ID + "=?", new String[]{ uri.getLastPathSegment() } );
            return count;
    }
}
4

1 に答える 1

1

delete メソッドが特定の旅行を削除するための URI を取得した場合、関連する日も削除する必要がありますか?それとも単に旅行を削除し、ContentProvider を使用して日を削除するために必要なロジックをプログラムに実行させる必要がありますか?

おそらく手動で行うのではなく、SQLite 内FOREIGN KEY関係を使用して、前者に投票します。日の記録には旅行以外の生活はないため、旅行を削除すると、それらの従属記録が削除されます。

于 2012-10-21T22:18:29.860 に答える