为了账号安全,请及时绑定邮箱和手机立即绑定

SQLiteConstraintException:NOT NULL 约束android

SQLiteConstraintException:NOT NULL 约束android

芜湖不芜 2022-04-28 17:11:18
我有一个编辑器活动,我在数据库中插入我的数据。我创建了 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);                            }    }
查看完整描述

1 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

您的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()


查看完整回答
反对 回复 2022-04-28
  • 1 回答
  • 0 关注
  • 297 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信