SQLiteConstraintException:NOT NULL 约束android

我有一个编辑器活动,我在数据库中插入我的数据。

我创建了 3 列:-

  • 标识健康

  • 任务 TEXT NOT NULL

  • 天文本

我使用来自编辑文本的数据将数据插入到任务列中,并通过创建包含编辑文本的警报对话框将其他数据插入到天数列中。

我成功地将数据插入任务列,但是当我将警报对话框中的数据插入天数列时,我收到此错误:-

“android.database.sqlite.SQLiteConstraintException:NOT NULL 约束失败:Task.TaskName(代码 1299)”。

请帮我解决这个问题。我知道有相同的问题可用,但 android studio 在调试 sq lite 数据库方面没有多大帮助,而且错误对所有人都不同,请记住,请不要将此问题标记为复制。

这是我的 SQLITE 创建语法

  public void onCreate(SQLiteDatabase db) {


        String query= "CREATE TABLE " + ChallengesEntry.DB_TABLE  + " ("

                +ChallengesEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "

                +ChallengesEntry.DB_COLUMN + " TEXT , "

                +ChallengesEntry.DB_COLUMN_DAYS + " TEXT);";


        db.execSQL(query);

    }

这是我的编辑活动课程


  @Override

    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {

            case R.id.action_save:

                insertTask();

                // Exit activity

                finish();

                return true;


            case android.R.id.home:

                // Navigate back to parent activity (CatalogActivity)

                NavUtils.navigateUpFromSameTask(this);

                return true;

        }


        return super.onOptionsItemSelected(item);


    }

    @Override

    public void onClick(View v) {

        switch (v.getId()){

            case R.id.button1:


                final EditText editText =  new EditText(this);

                AlertDialog dialog = new AlertDialog.Builder(this)

                        .setTitle("Add new Challenge")

                        .setMessage("Whats your Challenge")

                        .setView(editText)

                        .setPositiveButton("Add", new DialogInterface.OnClickListener() {

                            @Override

                            public void onClick(DialogInterface dialog, int which) {

                                String task = String.valueOf(editText.getText());

                                insertDay(task);

                            }

    }


芜湖不芜
浏览 298回答 1
1回答

婷婷同学_

您的CREATE TABLE声明不包括NOT NULL该列TaskName,尽管您说它被定义为NOT NULL.所以这是第一个不一致。您必须更改此行:+ChallengesEntry.DB_COLUMN + " TEXT , "到+ChallengesEntry.DB_COLUMN + " TEXT NOT NULL, "然后从模拟器/设备卸载应用程序,以便删除数据库,然后重新运行应用程序,以便重新创建数据库和表。但是有一种情况是已经NOT NULL为列创建了表,TaskName并且您可能对代码进行了不反映表的真实状态的更改。如果是这种情况,那么您得到的错误是有原因的:您有 2 种不同的方法:insertTask()并将insertDay()数据插入到您的表中!为什么?这意味着表的每一行都有一个 ID,只有 1 列包含数据,另一列为空 ( null)。这是你想要的吗?我不这么认为。因此,如果列TaskName已定义NOT NULL并且您执行insertDay(),那么您会收到错误,因为TaskName在该行中没有值(它为空)并且这是不允许的。因此,从EditText和 中获取数据并AlertDialog使用 1 个插入语句将其保存到表中,如下所示:public boolean insertData(String taskName, String days){    DbHelper mDbHelper = new DbHelper(this);    SQLiteDatabase db = mDbHelper.getWritableDatabase();    ContentValues values = new ContentValues();    values.put(ChallengesEntry.DB_COLUMN,taskName);    values.put(ChallengesEntry.DB_COLUMN_DAYS,days);    boolean result = db.insert(ChallengesEntry.DB_TABLE, null, values) >= 0;    db.close();    return result;}如果插入成功,此方法返回true或。false你可以这样称呼它:boolean successful = insertData(taskName, days);其中taskname和days是您从EditText和收集的值AlertDialog。编辑在您的活动类中声明此变量:long taskId = 0; 此方法将插入任务名称:private long insertTask(){    String name = editChallengeName.getText().toString().trim();    if (name.isEmpty())        return -1;    DbHelper mDbHelper = new DbHelper(this);    SQLiteDatabase db = mDbHelper.getWritableDatabase();    ContentValues values = new ContentValues();    values.put(ChallengesEntry.DB_COLUMN, name);    long id = db.insert(ChallengesEntry.DB_TABLE, null, values);    db.close();    return id;}你把它叫做你有的地方insertTask();:taskid = insertTask();然后此方法将更新 id = taskid 的行:private void insertDay(String task) {    DbHelper mDbHelper = new DbHelper(this);    SQLiteDatabase db = mDbHelper.getWritableDatabase();    ContentValues values = new ContentValues();    values.put(ChallengesEntry.DB_COLUMN_DAYS, task );    db.update(ChallengesEntry.DB_TABLE, values, ChallengesEntry.DB_COLUMN + "=" + taskid, null);    db.close();}你调用它就像你调用前一个一样insertDay()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java