【问题标题】:Cant insert values in my sqlite database无法在我的 sqlite 数据库中插入值
【发布时间】:2017-04-03 04:42:31
【问题描述】:

我对数据库非常陌生,所以我在网上查看了一些指南并开始尝试制作自己的数据库。由于某种原因,我的 add 方法不起作用,我无法弄清楚为什么

这是我的数据库类

public class DBHandler extends SQLiteOpenHelper{

// Database Version
private static final int DATABASE_VERSION = 2;
// Database Name
private static final String DATABASE_NAME = "DictionaryInfo";
// Contacts table name
private static final String TABLE_WORDS = "Words";
// Shops Table Columns names
private static final String KEY_ID ="id";
private static final String KEY_WORD = "word";
private static final String KEY_MEANING = "meaning";
private static final String CREATE_WORDS_TABLE = "CREATE TABLE " + TABLE_WORDS + "("
        + KEY_ID + " INTEGER PRIMARY KEY," + KEY_WORD + " TEXT," + KEY_MEANING + " TEXT " + ")";
public DBHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {

    db.execSQL(CREATE_WORDS_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    db.execSQL("DROP TABLE IF EXISTS " + TABLE_WORDS);

    onCreate(db);
}

public void addWord(Word word){

    SQLiteDatabase db = this.getReadableDatabase();
    ContentValues values = new ContentValues();

    values.put(KEY_ID,word.getId());
    values.put(KEY_WORD,word.getWord());
    values.put(KEY_MEANING,word.getMeaning());

    db.insert(TABLE_WORDS,null,values);
    db.close();
}

public Word getWord(int id){

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query(TABLE_WORDS,null,KEY_ID + " = ?",new String[]{String.valueOf(id)},null,null,null);
    if (cursor != null)
        cursor.moveToFirst();

    Word word = new Word(Integer.parseInt(cursor.getString(0)),cursor.getString(1),cursor.getString(2));
    return word;

}

}

这是我的“单词”课

public class Word  {
int _id;
String word;
String meaning;


public Word(int id,String word, String meaning)
{
    this._id = id;
    this.word = word;
    this.meaning = meaning;
}


public int getId() {
    return this._id;
}

public void setId(int id) {
    this._id = id;
}

public String getMeaning() {
    return this.meaning;
}

public void setMeaning(String meaning) {
    this.meaning = meaning;
}

public String getWord() {
    return this.word;
}

public void setWord(String word) {
    this.word = word;
}

}

这是我的主要活动

public class MainActivity extends AppCompatActivity {

TextView tv1;
TextView tv2;
TextView tv3;
TextView tv4;
Button btn1;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    tv1 = (TextView)findViewById(R.id.tv1);
    tv2 = (TextView)findViewById(R.id.tv2);
    tv3 = (TextView)findViewById(R.id.tv3);
    tv4 = (TextView)findViewById(R.id.tv4);
    btn1 = (Button)findViewById(R.id.btn1);

    DBHandler db = new DBHandler(this);
    db.addWord(new Word(1,"abc","def"));
    Word word = db.getWord(1);
    tv1.setText(word.getWord());
    tv2.setText(word.getMeaning());

}

}

我尝试从数据库中提取值并将它们插入到文本视图中以检查其是否正常工作,但通过 logcat 我可以清楚地看到它是在插入过程中的某个地方引起的。

我的日志猫

com.example.android.psydictionary E/SQLiteLog: (1555) 在 [INSERT INTO Words(meaning,word,id) VALUES (?,?,?)] 中的 10 处中止:唯一约束失败:Words.id 11-19 12:34:44.875 17853-17853/com.example.android.psydictionary E/SQLiteDatabase: 插入错误含义=def word=abc id=1 android.database.sqlite.SQLiteConstraintException:唯一约束失败:Words.id(代码 1555) 在 android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(本机方法) 在 android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:784) 在 android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788) 在 android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86) 在 android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1471) 在 android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341) 在 com.example.android.psydictionary.DBHandler.addWord(DBHandler.java:51) 在 com.example.android.psydictionary.MainActivity.onCreate(MainActivity.java:31) 在 android.app.Activity.performCreate(Activity.java:5990) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2311) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2420) 在 android.app.ActivityThread.access$900(ActivityThread.java:154) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5294) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

【问题讨论】:

    标签: java database sqlite android-studio


    【解决方案1】:

    UNIQUE constraint failed 说明问题所在。您对一列(含义、单词、id)有一个 UNIQUE 约束,并尝试在该列中插入相同的值两次。

    很可能是 id 失败了。也许你可以离开它,它会在插入过程中被计算出来。否则,请检查您的测试数据。

    【讨论】:

    • 非常感谢。我知道我一遍又一遍地运行相同的添加行,这导致了一个错误
    猜你喜欢
    • 1970-01-01
    • 2013-06-18
    • 2023-04-03
    • 1970-01-01
    • 2020-10-16
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多