簡體   English   中英

sqlite約束異常主鍵必須唯一

[英]sqlite constraint exception primary key must be unique

我有3張桌子

表1:成員-要存儲有關成員的所有信息,

屬性:MemberUsername(PK),MemberPassword

表2:MsGroup-存儲每個注冊的組

屬性:GroupId(PK),GroupName,GroupDescription

表3:MsGroupDetail-存儲每個組中每個用戶名的列表

屬性:GroupId(PK,FK),MemberUsername(PK,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,日志貓說:“ SQLite約束異常,主鍵必須是唯一的”

* nb:我的MsGroupDetail再次列出了組中的每個成員,

我已經在Sql Server Management Studio 2008中測試了相同的概念,並且可以正常工作,我不知道有什么比上面編碼的概念更好的概念,

你們能告訴我對此有什么解決方案嗎?

非常感謝..

問題是您的GROUP_ID不是唯一的。 如果您在第1組中有兩個成員,您的表將有兩個條目-

1, Member 1
1, Member 2

通過在GROUP_ID上指定“ PRIMARY KEY”,您可以說它將是唯一的。 您需要其他主鍵。 在android中,通常使用“ _id”,例如-

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM