문제

사람은 좋은 조언을 구현하는 방법에 대 한 일에 대한 매핑 SQLiteContentProvider?에서 보면 Uri ContentProvider#insert(Uri, ContentValues) 당신이 볼 수있는 가 ContentValues param 포함하는 데이터를 삽입합니다.문제는 현재 구현 ContentValues 지원하지 않는 put(String, Object) 방법과 클래스는 그래서 저는 확장할 수 없습니다.왜 그것이 문제인가?여기에 나는 디자인:

저는 2 개의 테이블에 있는 하나의 관계.을 나타내는 이 코드가 있는 2 모델 개체입니다.1 을 나타내는 주요 기록하고 있는 필드의 명부 2 개체를 인스턴스가 있습니다.지금 내가 있는 도우미는 방법에서는 모델 개체 1 위를 반환하는 ContentValues 생성되는 현재 개체입니다.그것의 사소한을 채우는 원시된 필드 ContentValues#put 과부하는 방법 그러나 나는 행운의 위 목록에 있습니다.그래서 현재 이후 2 차 행 테이블이 단지 하나의 문자열 값을 생성하는 쉼표로 구분하는 문자열을 그때 나는 재분석을 String[]부 ContentProvider#insert.는 느낌이 안 좋아요,그래서 어쩌면 사람이 할 수 있게 힌트를 할 수 있는 청소기의 패션이다.

여기에 몇 가지 코드입니다.처음에서는 모델에서 클래스:

public ContentValues toContentValues() {
    ContentValues values = new ContentValues();
    values.put(ITEM_ID, itemId);
    values.put(NAME, name);
    values.put(TYPES, concat(types));
    return values;
}

private String concat(String[] values) { /* trivial */}

그리고 여기에 빠른 속도와 유연전 ContentProvider#insert 방법

public Uri insert(Uri uri, ContentValues values) {
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    db.beginTransaction();
    try {
        // populate types
        String[] types = ((String)values.get(Offer.TYPES)).split("|");
        // we no longer need it
        values.remove(Offer.TYPES);
        // first insert row into OFFERS
        final long rowId = db.insert("offers", Offer.NAME, values);
        if (rowId > 0 && types != null) {
            // now insert all types for the row
            for (String t : types) {
                ContentValues type = new ContentValues(8);
                type.put(Offer.OFFER_ID, rowId);
                type.put(Offer.TYPE, t);
                // insert values into second table
                db.insert("types", Offer.TYPE, type);
            }
        }
        db.setTransactionSuccessful();
        return ContentUris.withAppendedId(Offer.CONTENT_URI, rowId);
    } catch (Exception e) {
        Log.e(TAG, "Failed to insert record", e);
    } finally {
        db.endTransaction();
    }

}
도움이 되었습니까?

해결책

나는 당신을 보고 잘못된 말을 많은 관계이다.

살펴보 ContactsContract 콘텐츠 공급자가,예를 들어.연락처할 수 있는 많은 이메일 주소,많은 전화번호 등입니다.는 방법이 달성을 하는 것이 삽입 업데이트//삭제하에 "많은 것" 측.를 추가하는 새로운 전화번호로 삽입하는 새로운 전화 번호를 제공하고,ID 의 연락처 누구를 위해 전화 번호함됩니다.

당신은 할 것 같은 경우 일반 SQLite 데이터베이스 내용이 없는 제공자입니다.One-to-many 관계형 데이터베이스에서 관계를 통해 달성 삽입 업데이트//삭제에서 테이블에 대한"많은 것"면,각각 외국 키를 다시는"하나"측.

지금부터 OO 관점에서,이것이 이상적입니다.당신은 환영받을 만들 ORM 스타일 랩퍼체(생각하는 최대 절전 모드)조작할 수 있도록 하는 컬렉션의 어린이는"하나"측.는 충분히 지능적인 컬렉션을 할 수 있습니다 클래스 그리고 돌아와 동기화""많은 테이블과 일치합니다.그러나 이러한 반드시되지 않은 사소한 제대로 구현.

다른 팁

당신이 사용할 수 있는 ContentProviderOperations 니다.

그들은 기본적으로 대량으로 운영하는 능력을 뒷면 참조하는 이 방법은 windows nt 와 같은 멀티쓰레 부모의 행이 있습니다.

는 방법 ContentProviderOperations 을 위해 사용될 수 있는 많은 디자인이 아주 잘 설명에서 이 응답: 무엇을 의미의 withValueBackReference?

그래서 내가 응답하는 내 자신의 질문입니다.내가 오른쪽에는 트랙으로는 두 개의 테이블과 두 개의 모델이다.무엇이었을하고 무엇 혼란 나는 내가 원하는 직접 삽입하는 복잡한 데이터를 통해 ContentProvider#insert 하나에서 호출합니다.이것은 잘못된 것입니다. ContentProvider 를 만들어야 하고 유지하는 이러한 두 가지 표지만에 결정을 내리는 테이블을 사용해야에 의해 결정 Uri 의 매개변수 ContentProvider#insert.그것은 매우 편리하게 사용할 ContentResolver 추가 등의 방법으로"addFoo"모델체입니다.이러한 방법은 걸릴 것 ContentResolver 매개 변수에서 여기서 끝나는 순서를 삽입하려면 복잡한 기록:

  1. 삽입하는 부모를 통해 기록 ContentProvider#insert 과를 얻을 레코드 id
  2. 당 자식을 제공하는 부모 ID(foregn key)를 사용 ContentProvider#insert 으로 다른 Uri 에 삽입하는 아이가 기록

그래서 유일한 나머지 질문이 어떻게 봉투를 위 코드에서 트랜잭션?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top