有人对如何实现一对多映射有很好的建议SQLite
吗ContentProvider
?如果您查看,Uri ContentProvider#insert(Uri, ContentValues)
您会发现它具有ContentValues
包含要插入的数据的参数。问题是它当前的实现ContentValues
不支持put(String, Object)
方法并且类是最终的,所以我不能扩展它。为什么这是一个问题?我的设计来了:
我有 2 个表,它们是一对多的关系。为了在代码中表示这些,我有 2 个模型对象。1st 代表主记录,并有一个字段是第二个对象实例的列表。现在我在模型对象#1 中有一个辅助方法,它返回ContentValues
从当前对象生成的。用重载方法填充原始字段很简单,ContentValues#put
但我对列表不走运。所以目前由于我的第二个表行只是一个字符串值,我生成了一个逗号分隔的字符串,然后我将其重新解析为 String[] inside 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();
}
}