Java 为什么这里的db.insertWithOnConflict返回-1?

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,

在本活动中,我们可以输入一所学校的考试信息,并将其添加到其他学校的考试中

Test.java: TestDbHelper.java: 活动预览: []

在本例中,我正在输入要添加到测试列表中的新测试的信息。 当我按下按钮时,它应该向数据库中的测试表添加一个新的测试。 如您所见,在这一行中,它应该添加:

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);