Java 为什么这里的db.insertWithOnConflict返回-1?
在本活动中,我们可以输入一所学校的考试信息,并将其添加到其他学校的考试中 Test.java: TestDbHelper.java: 活动预览: [] 在本例中,我正在输入要添加到测试列表中的新测试的信息。 当我按下按钮时,它应该向数据库中的测试表添加一个新的测试。 如您所见,在这一行中,它应该添加:Java 为什么这里的db.insertWithOnConflict返回-1?,java,android,database,sqlite,android-sqlite,Java,Android,Database,Sqlite,Android Sqlite,在本活动中,我们可以输入一所学校的考试信息,并将其添加到其他学校的考试中 Test.java: TestDbHelper.java: 活动预览: [] 在本例中,我正在输入要添加到测试列表中的新测试的信息。 当我按下按钮时,它应该向数据库中的测试表添加一个新的测试。 如您所见,在这一行中,它应该添加: dbHelper.insetItem(test); 是插入函数,在此行中: long insertId = db.insertWithOnConflict(TABLE_TESTS, null,
dbHelper.insetItem(test);
是插入函数,在此行中:
long insertId = db.insertWithOnConflict(TABLE_TESTS, null, test.getContentValuesForDb(), SQLiteDatabase.CONFLICT_REPLACE);
它应该添加它并返回一个非-1。
但是它返回-1,这表明我们的插入失败了
没有错误。实际上我不知道为什么它得到-1并且没有在DB中插入该项
有人能解决这个问题吗?确保表中有一些适当的约束,例如主键或唯一键。 插入时,通过ContentValues将值添加到此受约束列。如果插入新行会违反某些约束,则首先删除冲突行,然后插入新行。
在您的例子中,列_ID看起来是主键约束的一个很好的候选者。代码中的第二个arg nullColumnHack和value COLUMN_ID不是必需的,您可以将其作为null传递。首先,我将nullColumnHack作为null传递,如代码中所示。其次,我将“testID”设置为主键。我以前做过,但仍然不起作用。老实说,伙计,你为什么不使用ROOM library(Android的数据库存储官方库)。你不必为这些愚蠢的数据库错误而烦恼。我个人认为这是最有用的手册:使用
insertOrThrow()
。
package com.example.amirmasoudfallahi.testcorrector;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class DefineTestActivity extends AppCompatActivity {
TestDBHelper dbHelper;
EditText inputTestName, inputSchName, inputPrtNum, inputQuesNum, inputLessNum;
Button subTest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_define_test);
dbHelper = new TestDBHelper(this);
inputTestName = (EditText) findViewById(R.id.txt_testNameIn);
inputSchName = (EditText) findViewById(R.id.txt_schNameIn);
inputPrtNum = (EditText) findViewById(R.id.txt_prtcpntNumIn);
inputQuesNum = (EditText) findViewById(R.id.txt_testQuesNumIn);
inputLessNum = (EditText) findViewById(R.id.txt_lessNum);
subTest = (Button) findViewById(R.id.btn_createTestSubmit);
subTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Test test = new Test();
test.setName(inputTestName.getText().toString().trim());
test.setSchName(inputSchName.getText().toString().trim());
test.setQuesNum(Integer.parseInt(inputQuesNum.getText().toString().trim()));
test.setParticipantNum(Integer.parseInt(inputPrtNum.getText().toString().trim()));
test.setLessonNum(Integer.parseInt(inputLessNum.getText().toString().trim()));
dbHelper.insetItem(test);
Intent intent = new Intent(DefineTestActivity.this, AnswerKeysActivity.class);
intent.putExtra("lessonNum", test.getLessonNum());
startActivity(intent);
}
});
}
}
dbHelper.insetItem(test);
long insertId = db.insertWithOnConflict(TABLE_TESTS, null, test.getContentValuesForDb(), SQLiteDatabase.CONFLICT_REPLACE);