我正在使用 Room 数据库实现一个 android 应用程序,并且有一个关于这个数据库中的关系的小问题。
我有两个表:
@Entity(tableName = "foods", primaryKeys = {"id", "language_id"},
indices = {@Index(value = {"id", "language_id"}, unique = true)},
inheritSuperIndices = true)
public class Food {
@NonNull
@ColumnInfo(name = "id")
private String mId;
@NonNull
@ColumnInfo(name = "language_id")
private String mLanguageId;
}
@Entity(tableName = "ingredients", primaryKeys = {"id", "language_id"},
indices = {@Index(value = {"id", "language_id"}, unique = true),
@Index(value = {"food_id", "food_language_id"}, unique = true)},
foreignKeys = {@ForeignKey(entity = Food.class, parentColumns ="id",
childColumns = "food_id", onUpdate = CASCADE, onDelete = CASCADE),
@ForeignKey(entity = Food.class, parentColumns = "language_id",
childColumns = "food_language_id", onUpdate = CASCADE, onDelete =
CASCADE)},
inheritSuperIndices = true)
public class Ingredient {
@NonNull
@ColumnInfo(name = "id")
private String mId;
@NonNull
@ColumnInfo(name = "language_id")
private String mLanguageId;
@ColumnInfo(name = "food_id")
private String mFoodId;
@ColumnInfo(name = "food_language_id")
private String mFoodLanguageId;
}
'Food' 和 'Ingredient' 这两个表都有复合主键('id','language_id')。 Food 对象必须包含一个列表,当然还有一个@Relationship
public class FoodWithIngredients extends Food{
@Relation(parentColumn = "id", entityColumn = "food_id", entity =
Ingredient.class)
private List<Ingredient> mIngredients;
}
在我尝试运行此代码后收到这些消息
警告:
food_language_id column references a foreign key but it is not part of an index. This may trigger full table scans whenever parent table is modified so you are highly advised to create an index that covers this column.
错误:
Ingredient has a foreign key (food_id) that references Food (id) but Food does not have a unique index on those columns nor the columns are its primary key. SQLite requires having a unique constraint on referenced parent columns so you must add a unique index to Food that has (id) column(s).
有人可以帮我吗?
提前致谢:)
最佳答案
好的,我发现我错在哪里了。我的@ForeignKey 错了,正确的是:
@ForeignKey(
entity = Food.class,
parentColumns = {"id", "language_id"},
childColumns = {"food_id", "food_language_id"},
onUpdate = CASCADE, onDelete = CASCADE)
不同之处在于,我在“parentColumns”和“childColumns”中放置了多个列,它工作正常。
@Danail Alexiev 插入是这样的:
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertFoods(List<Food> foods);
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertIngredients(List<Ingredient> ingredients);
@Transaction
public void insertFoodData(List<Food> foods, RulesOfGolfDatabase database) {
if (foods != null && database != null) {
insertFoods(foods);
for (Food food : foods) {
insertIngredients(food.getIngrediants());
}
}
}
这里最重要的是你必须首先插入@Relation 的所有者(在这个例子中是 Food),然后是关系中的每个数据
关于android - 房间复合主键链接到外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50248668/
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我使用脚手架和Rails3创建了2个模型。模型是位置和作业,每个作业都有一个位置。我在脚手架生成代码中创建了所需的引用调用,但是当我查看创建新作业的View时,我看到的只是一个文本框,我应该在其中添加location_id。我怎样才能让它变成下拉菜单以获得更好的用户体验? 最佳答案 想象一下,您有每个位置的titleAPI:http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/collection_select 关于r
第一步,先创建一个回环端口,不要用自己的网卡,很不稳定,会断的。①先找到“设备管理器”,点击②进入设备管理器点击“操作”,然后再点击“添加过时硬盘”,记得点击“操作”前先随便在空白处点击一下,不然点击“点击操作”会出现第二张图的内容。 ③点击“下一页”④点击“手动”,然后再点击下一页。 ⑤点击“网络适配器”,点击下一页 ⑥点击“Microsoft”,然后点击“环回适配器”。 创建完成后,在下图中会有一个“环回适配器”, 第二步,ensp和真机进行桥接①打开ensp,并且配置一个“云”②先添加一个内网接口,点击添加③选择“绑定信息”中的以太网2,点击“增加”,添加外网。如果找不到你的环回网卡
我正在为ruby开发一个C扩展,但我需要包含来自IOBluetooth框架的header,特别是:#import#import一切都编译正常,但在运行时,扩展错误:path/to/file.rb:1:in`require_relative':dlopen(/path/to/extension.bundle,9):Symbolnotfound:_OBJC_CLASS_$_IOBluetoothDeviceInquiry(LoadError)我相当确定这与未包含在链接过程中的框架有关,但我不确定原因。任何帮助将不胜感激extconf.rb:#Loadsmkmfwhichisusedto
我正在生成PDF文件,我的链接如下所示::pdf%>当我点击它时,它会将我带到/display_invoice/123456789(这是一个HTML版本)。ControllerAction如下:defdisplay_invoiceifparams[:invoice_number]@invoice=...respond_todo|format|format.htmlformat.pdfdo#renderpdf:'123',#filenamerenderpdf:params[:invoice_number],layout:'layouts/application.pdf.erb'#,#la
我正在学习rubyonrails的基础知识,我想做一些简单的查询,但我有疑问:我将拥有这些模型:classClient现在,我将使用脚手架来生成所有的东西,我想知道我是否必须直接将外键放在脚手架中,例如:rails生成脚手架地址street:stringnumber:integerclient_id:integer或者当我建立这些关联然后迁移我的数据库时,它们将是隐式的?我不知道我是否以最好的方式解释了自己。谢谢 最佳答案 是的,没有引用。您需要传递client_id或对Client模型的引用,例如:railsgenerates
我使用postgresql9.3、Ruby2.0、Rails4.0.0。在阅读了很多有关在表上设置主键的问题后,我生成并添加了以下迁移:classCreateShareholders我还在我的模型中添加了self.primary_key="uid"。迁移成功运行,但是当我使用pgAdminIII连接到数据库时,我看到uid列未设置为主键。我错过了什么? 最佳答案 看看thisanswer.尝试执行“ALTERTABLEshareholdersADDPRIMARYKEY(uid);”,而不在create_tableblock中指定pr
我有一个表students,字段为ward_id,我必须创建一个名为guardian_users的表,字段为id,ward_id,email,guardian_id,hashed_password等现在我必须添加约束外键。学生中的任何更新/删除/编辑/插入应该对guardian_users具有相同的效果。我如何在Rails2.3.5中做到这一点?students表存在,但其他表还不存在。 最佳答案 您要么需要foreign_key_migrations插件或#execute方法。假设您使用插件:classCreateGuardi
给定像Thread(id,uuid)这样的模型,uuid是一个唯一生成的标识符。我想更改默认路由:edit_threadGET/threads/:id/edit(.:format){:action=>"edit",:controller=>"threads"}threadGET/threads/:id(.:format){:action=>"show",:controller=>"threads"}PUT/threads/:id(.:format){:action=>"update",:controller=>"threads"}不使用:id而是使用用户:uuid---这在Rails/
运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid