문제
사람은 좋은 조언을 구현하는 방법에 대 한 일에 대한 매핑 SQLite
용 ContentProvider
?에서 보면 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 매개 변수에서 여기서 끝나는 순서를 삽입하려면 복잡한 기록:
- 삽입하는 부모를 통해 기록
ContentProvider#insert
과를 얻을 레코드 id - 당 자식을 제공하는 부모 ID(foregn key)를 사용
ContentProvider#insert
으로 다른 Uri 에 삽입하는 아이가 기록
그래서 유일한 나머지 질문이 어떻게 봉투를 위 코드에서 트랜잭션?