2014-11-18 3 views
1

У меня 3 таблицыSQLite исключение ограничений первичный ключ должен быть уникальным

Таблица 1: Член - Для того, чтобы хранить каждую информацию об участнике,

Атрибут: MemberUsername (ПК), MemberPassword

Таблица 2 : MSgroup - Для того, чтобы хранить каждый зарегистрированный группу

Атрибут: GroupID (ПК), ИмяГруппы, GroupDescription

Таблица 3: MsGroupDet Айыл - К списку магазина каждого пользователя в каждой группе

Атрибут: 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 + "));"); 

I успешно создать код для создания члена, создать группу, но проблема в том, что я не смог создать запрос для приглашения/добавления нового члена в группу (не удалось вставить в 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; 
} 

Everytime I пригласить новый член/добавление к MsGroupDetail таблице, я не смог вставить его в MsGroupDetail и журнал кот сказал: «SQLite Constraint Exception, первичный ключ должен быть уникальным»

* пь: Мой MsGroupDetail еще раз, чтобы перечислить всех членов в группе,

Я испытал ту же концепцию в Sql Stu Management Server, dio 2008 и он работал, я не знаю никакой лучшей концепции, чем то, что я закодировал выше,

Можете ли вы, ребята, сказать мне, есть ли какое-либо решение для этого?

Большое спасибо ..

ответ

1

Проблема ваша GROUP_ID не является уникальным. Если у вас есть два члена в 1-й группе, ваша таблица будет иметь две записи -

1, Member 1 
1, Member 2 

Указав «PRIMARY KEY» на GROUP_ID вы заявляете, это будет уникальным. Вам нужен другой первичный ключ. В андроиде принято использовать «_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 + "));"); 
+1

Является ли «_id» всегда основным ключом на каждом столе? –

+1

Если '_id' никогда не используется, нет необходимости добавлять его в первую очередь. –

+0

@JuliusLeo Некоторые компоненты Android (например, виды списка) требуют определенных столбцов с именем '_id'. Однако вы не будете использовать такой запрос для * этой * таблицы, и когда вы показываете список, например, групп, вы всегда можете переименовать столбец 'GROUP_ID' ​​в' _id' при запросе. –

Смежные вопросы