Java sqlite约束异常主键必须唯一

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

我有三张桌子

表1:成员-要存储有关成员的所有信息

属性:MemberUsername(PK)、MemberPassword

表2:MsGroup—存储每个已注册的组

属性:GroupId(PK)、GroupName、GroupDescription

表3:MsGroupDetail-存储每个组中每个用户名的列表

属性:GroupId(主键,FK),MemberUsername(主键,FK)

我对创建这3个表的查询:

        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 + "));");