누구나 SQLite
에 일대 다 매핑을 구현하는 방법에 대한 조언이 ContentProvider
을 사용합니까? Uri ContentProvider#insert(Uri, ContentValues)
을 보면 삽입 할 데이터가 포함 된 ContentValues
param이 있음을 알 수 있습니다. 문제는 현재 구현에서 ContentValues
은 put(String, Object)
메서드를 지원하지 않으므로 클래스가 final이므로 확장 할 수 없습니다. 왜 그것이 문제입니까? 내 디자인은 다음과 같습니다.Android : SQLite 일대 다 디자인
1 대 다 관계에있는 2 개의 테이블이 있습니다. 코드에서이를 나타 내기 위해 2 개의 모델 객체가 있습니다. 1st는 주 레코드를 나타내며 두 번째 객체 인스턴스의 목록 인 필드를가집니다. 이제는 현재 개체에서 생성 된 ContentValues
을 반환하는 모델 개체 # 1에 도우미 메서드가 있습니다. ContentValues#put
오버로드 된 메소드로 원시 필드를 채우는 것은 사소한 일이지만 목록에는 운이 없네요. 그래서 현재 두 번째 테이블 행이 단일 문자열 값이므로 쉼표로 구분 된 문자열을 생성 한 다음 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();
}
}
그래, 나도 같은 문제가 ... 하나의 트랜잭션에 여러 삽입 봉투하는 방법? 나는 두 개의 특별한 URI를 추가하여 이것을 관리했다 : 하나는 변환의 시작을위한 것이고 다른 하나는 끝을위한 것이다. 나는 이것이 최선의 해결책이 아니라는 것을 알고있다. 당신이 더 좋은 사람이라면 나는 그것을 감사 할 것입니다! – Bhiefer