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()
添加回答
举报