Java Android的SQLite错误:";“列不是唯一的”;

Java Android的SQLite错误:";“列不是唯一的”;,java,android,database,sqlite,Java,Android,Database,Sqlite,我花了很多时间寻找答案,但我找不到 我试图在我的Android应用程序上使用SQLite数据库,但当我试图添加一个带有db.insert(object)的新对象时,我收到一个错误,说我的主键不是唯一的 我做错了什么 SQLite数据库: public class SqlCadastro extends SQLiteOpenHelper{ private static final int DATABASE_VERSION = 1; private static final Stri

我花了很多时间寻找答案,但我找不到

我试图在我的Android应用程序上使用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)
我做错了什么

您正在向数据库表中添加一行,其中所需的主键已被另一个现有行使用。要么:

  • 使用单独的列作为主键,例如添加
    \u ID INTEGER主键自动递增
    ,或

  • 确保您在
    Nome
    列中输入的所有内容都是唯一的

我做错了什么

您正在向数据库表中添加一行,其中所需的主键已被另一个现有行使用。要么:

  • 使用单独的列作为主键,例如添加
    \u ID INTEGER主键自动递增
    ,或

  • 确保您在
    Nome
    列中输入的所有内容都是唯一的


    • Nome
      KEY\u Nome
      )被声明为唯一的&作为主键(这意味着唯一)。
      确保
      Nome
      中没有重复但唯一的值列
      Nome
      KEY\u Nome
      )被声明为唯一的&作为主键(这意味着唯一)。
      确保
      Nome

      中没有重复但唯一的值,这看起来很有效。但是现在我必须向用户显示列表。谢谢!看起来这很有效。但是现在我必须向用户显示列表。谢谢!