2014-06-23 3 views
1

답변을 검색하는 데 많은 시간을 할애했지만 찾을 수 없습니다.Android 용 SQLite 오류 : "열이 고유하지 않습니다."

안드로이드 앱에서 SQLite 데이터베이스를 사용하려고하는데 "db.insert (object)"라는 새 개체를 추가하려고 할 때 내 기본 키가 고유하지 않다는 오류가 발생합니다.

내가 뭘 잘못하고 있니?

SQLite 데이터베이스 :

public class SqlCadastro extends SQLiteOpenHelper{ 
private static final int DATABASE_VERSION = 1; 
private static final String DATABASE_NAME = "contactsManager"; 
private static final String TABLE_MATERIAS = "Materias"; 

// Contacts Table Columns names 
private static final String KEY_NOME = "Nome"; 
private static final String KEY_NOTA1 = "Tri1"; 
private static final String KEY_NOTA2 = "Tri2"; 
private static final String KEY_NOTA3 = "Tri3"; 
private static final String KEY_PRENOTA3 = "Est3Tri"; 
private static final String KEY_MA = "MA"; 
private static final String KEY_PREPFV = "EstPFV"; 
private static final String KEY_PFV = "PFV"; 

public SqlCadastro(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

// Creating Tables 
@Override 
public void onCreate(SQLiteDatabase db) { 
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_MATERIAS + "(" 
      + KEY_NOME + " TEXT UNIQUE," + KEY_NOTA1 + " FLOAT," + KEY_NOTA2 + " FLOAT," + KEY_PRENOTA3 + " FLOAT," 
      + KEY_NOTA3 + " FLOAT," + KEY_MA + " FLOAT," + KEY_PREPFV + " FLOAT, " + KEY_PFV + " FLOAT, PRIMARY KEY (" + KEY_NOME + ") ON CONFLICT IGNORE)" + ")"; 
    db.execSQL(CREATE_CONTACTS_TABLE); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_MATERIAS); 
    onCreate(db); 
} 


public void addMateria(Materias materia) { 
    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(KEY_NOME, materia.getNome()); 
    values.put(KEY_NOTA1, Float.toString(materia.getNota1())); 
    values.put(KEY_NOTA2, Float.toString(materia.getNota2())); 
    values.put(KEY_PRENOTA3, Float.toString(materia.getPreNota3())); 
    values.put(KEY_NOTA3, Float.toString(materia.getNota3())); 
    values.put(KEY_MA, Float.toString(materia.getMA())); 
    values.put(KEY_PREPFV, Float.toString(materia.getPrePFV())); 
    values.put(KEY_PFV, Float.toString(materia.getPFV())); 

    // Inserting Row 
    db.insertOrThrow(TABLE_MATERIAS, null, values); 
    db.close(); // Closing database connection 
} 

에로 로그 : 내가 잘못 뭐하는 거지

FATAL EXCEPTION: main 
    android.database.sqlite.SQLiteConstraintException: column Nome is not unique (code 19) 
    at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native  Method) 
    at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:775) 
    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:1469) 
    at android.database.sqlite.SQLiteDatabase.insertOrThrow(SQLiteDatabase.java:1365) 
    at com.testemedia.mediacp2.SqlCadastro.addMateria(SqlCadastro.java:68) 
    at com.testemedia.mediacp2.Cadastrar.onClick(Cadastrar.java:49) 
    at android.view.View.performClick(View.java:4084) 
    at android.view.View$PerformClick.run(View.java:16966) 
    at android.os.Handler.handleCallback(Handler.java:615) 
    error opening trace file: No such file or directory (2) 

답변

3

?

원하는 기본 키가 다른 기존 행에 의해 이미 사용되는 데이터베이스 테이블에 행을 추가하고 있습니다. 다음 중 하나를

  • 는 당신이 Nome 컬럼에 넣어 모든

+0

그 것처럼 보입니다. 하지만 지금은 목록을 사용자에게 보여줘야합니다. 고마워요! – George

1

열이 고유한지 확인 _ID INTEGER PRIMARY KEY AUTOINCREMENT, 또는

  • 을 추가하는 등, 기본 키로 별도의 열을 사용하여 Nome (KEY_NOME)은 기본 키 (고유 함을 의미)로 고유 &으로 선언됩니다. Nome에는 중복되지만 고유 한 값이 없음을 확인하십시오.

  • 관련 문제