Java sqlite约束异常主键必须唯一
我有三张桌子 表1:成员-要存储有关成员的所有信息 属性:MemberUsername(PK)、MemberPassword 表2:MsGroup—存储每个已注册的组 属性:GroupId(PK)、GroupName、GroupDescription 表3:MsGroupDetail-存储每个组中每个用户名的列表 属性:GroupId(主键,FK),MemberUsername(主键,FK) 我对创建这3个表的查询:Java sqlite约束异常主键必须唯一,java,android,database,sqlite,Java,Android,Database,Sqlite,我有三张桌子 表1:成员-要存储有关成员的所有信息 属性:MemberUsername(PK)、MemberPassword 表2:MsGroup—存储每个已注册的组 属性:GroupId(PK)、GroupName、GroupDescription 表3:MsGroupDetail-存储每个组中每个用户名的列表 属性:GroupId(主键,FK),MemberUsername(主键,FK) 我对创建这3个表的查询: db.execSQL("CREATE TABLE IF NOT
db.execSQL("CREATE TABLE IF NOT EXISTS " + MS_MEMBER + " ("
+ MEMBER_USERNAME + " TEXT PRIMARY KEY NOT NULL, "
+ MEMBER_PASSWORD + " TEXT NOT NULL, " + MEMBER_EMAIL
+ " TEXT NOT NULL" + ");");
db.execSQL("CREATE TABLE IF NOT EXISTS " + MS_GROUP + " ("
+ GROUP_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ GROUP_NAME + " TEXT NOT NULL, " + GROUP_DESCRIPTION
+ " TEXT NOT NULL);");
db.execSQL("CREATE TABLE IF NOT EXISTS " + MS_GROUP_DETAIL + " ("
+ GROUP_ID + " INTEGER PRIMARY KEY, " + MEMBER_USERNAME
+ " TEXT, FOREIGN KEY (" + MEMBER_USERNAME
+ ") REFERENCES " + MS_MEMBER + "(" + MEMBER_USERNAME
+ "), FOREIGN KEY (" + GROUP_ID + ") REFERENCES "
+ MS_GROUP + "(" + GROUP_ID + "));");
我已经成功地编写了一些代码来创建成员、创建组,但问题是我未能创建一个查询来邀请/向组中添加新成员(未能插入到MsGroupDetail)
这是用于添加GroupMember的语法
public void addGroupMember(String groupId, String username) {
// TODO Auto-generated method stub
ContentValues cv2 = new ContentValues();
cv2.put(GROUP_ID, groupId);
cv2.put(MEMBER_USERNAME, username);
ourDatabase.insert(MS_GROUP_DETAIL, null, cv2);
}
这是查看我的组列表的语法
public String[] fetchGroupName(String username) {
int i = 0;
String Query = "SELECT " + GROUP_NAME + " From " + MS_GROUP
+ " a INNER JOIN " + MS_GROUP_DETAIL + " b ON a." + GROUP_ID
+ "=b." + GROUP_ID + " WHERE " + MEMBER_USERNAME + "=?";
Cursor c = ourDatabase.rawQuery(Query, new String[] { username });
String groupName[] = new String[c.getCount()];
int iGroupName = c.getColumnIndex(GROUP_NAME);
c.moveToFirst();
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
groupName[i] = c.getString(iGroupName);
i++;
}
c.close();
return groupName;
}
每次我邀请一个新成员/将其添加到MsGroupDetail表中时,我都无法将其插入到MsGroupDetail中,日志cat显示:“SQLite约束异常,主键必须是唯一的”
*注意:我的MsGroupDetail再次列出了一个组中的每个成员
我已经在Sql Server Management Studio 2008中测试了相同的概念,并且成功了,我不知道还有比我上面编写的更好的概念
你们能告诉我有什么解决办法吗
非常感谢。问题是您的
组ID
不是唯一的。如果组1中有两个成员,则表将有两个条目--
通过在组ID
上指定“主键”,您表示它是唯一的。您需要不同的主键。在android中,使用“_id”是很常见的,比如--
“\u id”是否始终是每个表上的主键?如果从未使用过
\u id
,则无需首先添加它。@JuliusLeo某些Android组件(例如列表视图)在某些查询中需要一个名为\u id
的列。但是,您不会对该表使用这样的查询,当您显示组列表时,您可以在查询时将组ID
列重命名为\u ID
。@CL是正确的,如果您不需要主键,则无需添加它。“_id”不一定是主键,这是一些适配器使用的惯例。您好,感谢您的回复,我对编程非常陌生,所以我正在努力跟上您的想法,每个表都需要一个主键,而且它必须是唯一的,因为我的GroupId不够唯一,所以_id将其替换为PK,,
1, Member 1
1, Member 2
db.execSQL("CREATE TABLE IF NOT EXISTS " + MS_GROUP_DETAIL + " ("
+ "_id INTEGER PRIMARY KEY AUTOINCREMENT,"
+ GROUP_ID + " INTEGER, " + MEMBER_USERNAME
+ " TEXT, FOREIGN KEY (" + MEMBER_USERNAME
+ ") REFERENCES " + MS_MEMBER + "(" + MEMBER_USERNAME
+ "), FOREIGN KEY (" + GROUP_ID + ") REFERENCES "
+ MS_GROUP + "(" + GROUP_ID + "));");