gpt4 book ai didi

Android:SQLite一对多设计

转载 作者:IT王子 更新时间:2023-10-29 06:20:07 26 4
gpt4 key购买 nike

有人对如何使用 ContentProvider 实现 SQLite 的一对多映射有很好的建议吗?如果您查看 Uri ContentProvider#insert(Uri, ContentValues),您可以看到它具有包含要插入的数据的 ContentValues 参数。问题是在其当前实现中 ContentValues 不支持 put(String, Object) 方法并且类是最终的,所以我无法扩展它。为什么这是个问题?我的设计来了:

我有 2 个表,它们是一对多关系。为了在代码中表示这些,我有 2 个模型对象。 1st 代表主记录并且有一个字段是 2nd 对象实例的列表。现在我在模型对象 #1 中有一个辅助方法,它返回从当前对象生成的 ContentValues。用 ContentValues#put 重载方法填充原始字段是微不足道的,但我运气不好。因此,目前由于我的第二个表行只是一个字符串值,所以我生成了一个逗号分隔的字符串,然后我将其重新解析为 ContentProvider#insert 中的 String[]。这感觉很恶心,所以也许有人可以暗示如何以更清洁的方式完成它。

这是一些代码。首先来自模型类:

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 数据库,您也会这样做。关系数据库中的一对多关系是通过对“多”端的表进行插入/更新/删除来实现的,每个表都有一个返回“一”端的外键。

现在,从 OO 的角度来看,这并不理想。欢迎您创建 ORM 样式的包装器对象(想想 Hibernate),它允许您从“一”端操作子集合。足够智能的集合类然后可以转身并同步“多”表以进行匹配。但是,正确实现这些并不一定是微不足道的。

关于Android:SQLite一对多设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2205327/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com