Как вводить данные правильно в базе данных?

Привет так как у меня есть приложение контактов, которые получаются с таблицы в базе данных, которую кроме того содержит число likes каждого контакта, у меня есть ImageButton и дав ему click нужно вводить новый like в таблице в id Вашего соответствующего контакта и TextView, который становится отвечающим современным требованиям показывая сумму likes, проблема состоит в том, что оно функционирует только с первым like, если я нажимаю снова на кнопку, чтобы выходить like на контакт, посылает мне следующее исключение:

Error inserting numero_likes=1 id=1
          android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: contacto_likes.id (code 1555)
       at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
       at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
       at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
       at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
       at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1472)
       at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1343) ...

Отлаживая я смог видеть, что в линии, в которой он дает мне исключение, она эта:

db.insert(ConstantesBaseDatos.TABLE_LIKES_CONTACT, null, contentValues);

Тогда не, каковой была моя ошибка, введя like.

Это мой класс BaseDatos (которого он получает в наследство от SQLiteOpenHelper):

public class BaseDatos extends SQLiteOpenHelper {

    private Context context;

    public BaseDatos(Context context) {
        super(context, ConstantesBaseDatos.DATABASE_NAME, null, ConstantesBaseDatos.DATABASE_VERSION);
        this.context = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        String queryCrearTablaContacto = "CREATE TABLE " + ConstantesBaseDatos.TABLE_CONTACTS + "(" +
                ConstantesBaseDatos.TABLE_CONTACTS_ID       + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                ConstantesBaseDatos.TABLE_CONTACTS_NOMBRE   + " TEXT, " +
                ConstantesBaseDatos.TABLE_CONTACTS_TELEFONO + " TEXT, " +
                ConstantesBaseDatos.TABLE_CONTACTS_EMAIL    + " TEXT, " +
                ConstantesBaseDatos.TABLE_CONTACTS_FOTO     + " INTEGER" +
                ")";

        String queryCrearTablaLikesContacto = "CREATE TABLE " + ConstantesBaseDatos.TABLE_LIKES_CONTACT + "(" +
                ConstantesBaseDatos.TABLE_LIKES_CONTACT_ID             + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                ConstantesBaseDatos.TABLE_LIKES_CONTACT_ID_CONTACTO    + " INTEGER, " +
                ConstantesBaseDatos.TABLE_LIKES_CONTACT_NUMERO_LIKES   + " INTEGER, " +
                "FOREIGN KEY (" + ConstantesBaseDatos.TABLE_LIKES_CONTACT_ID_CONTACTO + ") " +
                "REFERENCES " + ConstantesBaseDatos.TABLE_CONTACTS + " (" + ConstantesBaseDatos.TABLE_CONTACTS_ID + ")" +
                ")";

        db.execSQL(queryCrearTablaContacto);
        db.execSQL(queryCrearTablaLikesContacto);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + ConstantesBaseDatos.TABLE_CONTACTS);
        db.execSQL("DROP TABLE IF EXISTS " + ConstantesBaseDatos.TABLE_LIKES_CONTACT);

        onCreate(db);
    }

    public ArrayList<Contacto> obtenerTodosLosContactos() {
        ArrayList<Contacto> contactos = new ArrayList<>();

        String query = "SELECT * FROM " + ConstantesBaseDatos.TABLE_CONTACTS;

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor registros = db.rawQuery(query, null);

        while (registros.moveToNext()) {
            Contacto contactoActual = new Contacto();

            contactoActual.setId(registros.getInt(0));
            contactoActual.setNombre(registros.getString(1));
            contactoActual.setTelefono(registros.getString(2));
            contactoActual.setEmail(registros.getString(3));
            contactoActual.setFoto(registros.getInt(4));

            contactos.add(contactoActual);
        }

        db.close();

        return contactos;
    }

    public void insertarContacto(ContentValues contentValues) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.insert(ConstantesBaseDatos.TABLE_CONTACTS, null, contentValues);

        db.close();
    }

    public void insertarLikeContacto(ContentValues contentValues) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.insert(ConstantesBaseDatos.TABLE_LIKES_CONTACT, null, contentValues);

        db.close();
    }

    public int obtenerLikesContacto(Contacto contacto) {
        int likes = 0;

        String query = "SELECT COUNT(" + ConstantesBaseDatos.TABLE_LIKES_CONTACT_NUMERO_LIKES + ")" +
                " FROM " + ConstantesBaseDatos.TABLE_LIKES_CONTACT +
                " WHERE " + ConstantesBaseDatos.TABLE_LIKES_CONTACT_ID_CONTACTO + "=" + contacto.getId();

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor registros = db.rawQuery(query, null);

        if (registros.moveToNext()) {
            likes = registros.getInt(0);
        }

        db.close();

        return likes;
    }
}

И это методы, чтобы манипулировать темой, like добавлять в моем классе ConstructorContactos, которого я использовал как посредница:

public void darLikeContacto(Contacto contacto) {
    BaseDatos bd = new BaseDatos(context);

    ContentValues contentValues = new ContentValues();

    contentValues.put(ConstantesBaseDatos.TABLE_LIKES_CONTACT_ID, contacto.getId());
    contentValues.put(ConstantesBaseDatos.TABLE_LIKES_CONTACT_NUMERO_LIKES, LIKE);

    bd.insertarLikeContacto(contentValues);
}

public int obtenerLikesContacto(Contacto contacto) {
    BaseDatos db = new BaseDatos(context);
    return db.obtenerLikesContacto(contacto);
}

Тогда не, что вызвало ошибку, которая, когда раз дал like из-за второй вместо того, чтобы это вводить и возвращать сумму, бросает в меня исключение. Я надеюсь, что они могут помогать мне, спасибо.

0
задан 23.01.2017, 05:04
0 ответов

Согласно которому я достигаю разбираться в твоем коде, ошибка находится в том, что в таблице, где ты вводишь, не возможно повторять первичный ключ, в этом случае id, следовательно, если ты хочешь сделать новое вставление с тем же самым, пойдите выходит эта ошибка, было бы хорошим, что ты добавляешь полный код, который ты используешь для твоей базы данных, и так мочь помогать тебе находить лучше решение.

1
ответ дан 03.12.2019, 17:35
  • 1
    Хорошая observació n, самое важное они были бы CREATE statements, однако serí чтобы лучше это комментировать в вопросе и ждать с ответом до тех пор, пока вопрос не улучшен. :) –  22.01.2017, 08:31
  • 2
    Привет, я новый в этом и правда не была очень уверена того, что hací в, но revisé и действительно он занимал первичный ключ, я confundí с именами, которые я поместил, я обновляю вопрос, если он может служить ему помощью в кому-то, большое спасибо. –  23.01.2017, 04:59