Java 为什么出现“唯一约束失败”错误

Java 为什么出现“唯一约束失败”错误,java,android,sqlite,Java,Android,Sqlite,我试图将数据保存到MyList,但出现以下错误:唯一约束失败。我的错在哪里 我的数据库 db.execSQLCREATE TABLE如果不存在\Words\\n+ \t\Id\\t注册表项不为空主键自动递增\n+ \t\Name\\t文本\n+ \t\Mean\\t文本\n+ ;; db.execSQLCREATE TABLE如果不存在\MyList\\n+ \t\Id\\t标签不为空,\n+ \t\Name\\t文本\n+ \t\Mean\\t文本\n+ \t外键\Id\REFERENCES\

我试图将数据保存到MyList,但出现以下错误:唯一约束失败。我的错在哪里

我的数据库

db.execSQLCREATE TABLE如果不存在\Words\\n+ \t\Id\\t注册表项不为空主键自动递增\n+ \t\Name\\t文本\n+ \t\Mean\\t文本\n+ ;; db.execSQLCREATE TABLE如果不存在\MyList\\n+ \t\Id\\t标签不为空,\n+ \t\Name\\t文本\n+ \t\Mean\\t文本\n+ \t外键\Id\REFERENCES\Words\\Id\,\n+ \t主密钥\Id\\n+ ;; InsertWordToMyList可插入从单词中提取的单词

如果Mylist中存在单词,请不要插入

FindWordmy的主表是Words,所以我在Words中搜索数据(如果存在),然后将其拉出来

公共字符串InsertWordToListDbConnection数据,字符串kelime{ 单词yeni=null; SQLiteDatabase db=data.getWritableDatabase; ContentValues=新的ContentValues; 串味精; 布尔布尔布尔=ifExistsdata,kelime,db; 伊夫布尔{ msg=kelime-zaten变量; } 否则{ yeni=FindWorddata,kelime,db; 如果eni!=null{ Log.eyeni id,Integer.toStringyeni.getId; values.putId,yeni.getId; values.putName,yeni.getName; value.putMean,yeni.getMean; db.insertOrThrowMyList,null,值; msg=kelime-eklendi; } else msg=kelime数据库kayırlıdeğil; } db.close; 返回味精; } 公共Word FindWordDbConnection数据、字符串kelime、SQLiteDatabase数据库{ 单词w=新单词; //db=data.getWritableDatabase; 游标c=db.rawQuerySELECT*从Name='kelime',null的单词中选择; ifc!=null{ 而c.moveToNext{ w=新单词C.getIntc.getColumnIndexId ,c.getStringc.getColumnIndexName ,c.getStringc.getColumnIndexMean; } 返回w; } 否则{ 返回null; } } 公共布尔值ifdbconnection数据、字符串kelime、SQLiteDatabase数据库{ 单词w=null; 光标c=db.rawQuerySELECT*自Mylist,其中Name='kelime',null; 而c.moveToNext{ w=新单词C.getIntc.getColumnIndexId ,c.getStringc.getColumnIndexName ,c.getStringc.getColumnIndexMean; } ifw!=null返回true; 否则返回false; } InsertWordToMyList的用法:


forint i=0;我不知道这是否能解决您的问题,但实际上,您的代码正在搜索字符串文字“kelime”,而不是字符串参数kelime。 更改FindWord和ifExists的方法,如下所示:

public Word FindWord(DbConnection data, String kelime, SQLiteDatabase db) {
    Word w = null;
    Cursor c = db.rawQuery("SELECT * FROM Words WHERE Name = ?", new String[] {kelime});
    if (c.moveToNext()) {
        w = new Word(c.getInt(c.getColumnIndex("Id"))
                , c.getString(c.getColumnIndex("Name"))
                , c.getString(c.getColumnIndex("Mean")));
    }
    c.close();
    return w;
}

public Boolean ifExists(DbConnection data, String kelime, SQLiteDatabase db) {
    Cursor c = db.rawQuery("SELECT * FROM Mylist WHERE Name = ?", new String[] {kelime});
    int rows = c.getCount();
    c.close();
    return rows > 0;
}
我简化了大部分代码,因为您不需要循环。
另外,我看不出哪里需要参数DbConnection。

关于DbConnection,您是对的,它没有用,但其他东西不起作用。我还是会犯同样的错误我认为我的错误是FindWord的返回语句。我认为它返回空对象