为什么从 Java 添加到 Android 中的 SQLite 数据库的日期值始终为空?
Why date value added from Java to SQLite database in Android is always null?
我绝对是 Android 的初学者。我在处理 Android 中的日期时遇到问题。现在我将一个值从 EditText 字段插入到 SQLite table 列,该列是日期数据库日期。添加到数据库时它始终为空。我的代码有什么问题?
我的数据库助手class
public class DatabaseHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "todo.db";
private static final String TABLE_NAME = "task";
private static final String COLUMN_ID = "id";
private static final String COLUMN_DESCRIPTION = "description";
private static final String COLUMN_DATE ="date";
private static final String COLUMN_DONE = "done";
private static final String CREATE_TABLE = "CREATE TABLE "+TABLE_NAME+" ("+COLUMN_ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"+COLUMN_DESCRIPTION+" TEXT,"+
COLUMN_DATE+" DATE,"+COLUMN_DONE+" BOOLEAN)";
SQLiteDatabase db;
public DatabaseHelper(Context context)
{
super(context,DATABASE_NAME,null,DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
this.db = db;
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String query = "DROP TABLE IF EXISTS "+TABLE_NAME;
db.execSQL(query);
this.onCreate(db);
}
public void insertTask(Task task)
{
db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_DESCRIPTION,task.getDescription());
values.put(COLUMN_DATE,task.getDate().toString());
values.put(COLUMN_DONE,Boolean.FALSE.toString());
db.insert(TABLE_NAME, null, values);
db.close();
}
}
这是我在Fragment中的保存方法
public void saveTask()
{
String description = tfDescription.getText().toString();
String date = tfDate.getText().toString();
if(description.isEmpty())
{
Toast.makeText(getActivity().getBaseContext(),"Description is required",Toast.LENGTH_SHORT).show();
}
else if(date.isEmpty())
{
Toast.makeText(getActivity().getBaseContext(),"Date is required",Toast.LENGTH_SHORT).show();
}
else if(description.length()<getResources().getInteger(R.integer.min_description_length))
{
String minChar = String.valueOf(getResources().getInteger(R.integer.min_description_length));
Toast.makeText(getActivity().getBaseContext(),"Description should be minium "+minChar+" characters",Toast.LENGTH_SHORT).show();
}
else{
//check date
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
boolean parseOk = false;
Date taskDate = new Date();
try{
taskDate = format.parse(date);
Task task = new Task();
task.setDescription(description);
task.setDate(taskDate);
dbHelper.insertTask(task);
parseOk = true;
}
catch(ParseException e)
{
parseOk = false;
}
if(parseOk)
{
//insert task to database
Toast.makeText(getActivity().getBaseContext(),"Task saved",Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(getActivity().getBaseContext(),"Invalid date format",Toast.LENGTH_SHORT).show();
}
}
}
这是我的任务class
public class Task {
private int Id;
private String Description;
private java.util.Date TaskDate;
private boolean Done;
public void setId(int Id)
{
this.Id = Id;
}
public int getId()
{
return this.Id;
}
public void setDescription(String Description)
{
this.Description = Description;
}
public String getDescription()
{
return this.Description;
}
public void setDate(Date taskDate)
{
this.TaskDate = taskDate;
}
public Date getDate(){
return this.TaskDate;
}
public void setDone(Boolean done)
{
this.Done = done;
}
public Boolean getDone()
{
return this.Done;
}
}
这是我完整的 DatabaseHelper class
public class DatabaseHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "todo.db";
private static final String TABLE_NAME = "task";
private static final String COLUMN_ID = "id";
private static final String COLUMN_DESCRIPTION = "description";
private static final String COLUMN_DATE ="date";
private static final String COLUMN_DONE = "done";
private static final String CREATE_TABLE = "CREATE TABLE "+TABLE_NAME+" ("+COLUMN_ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"+COLUMN_DESCRIPTION+" TEXT,"+
COLUMN_DATE+" DATE,"+COLUMN_DONE+" BOOLEAN)";
SQLiteDatabase db;
public DatabaseHelper(Context context)
{
super(context,DATABASE_NAME,null,DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
this.db = db;
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String query = "DROP TABLE IF EXISTS "+TABLE_NAME;
db.execSQL(query);
this.onCreate(db);
}
public void insertTask(Task task)
{
db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_DESCRIPTION,task.getDescription());
values.put(COLUMN_DATE,task.getDate().toString());
values.put(COLUMN_DONE,Boolean.FALSE.toString());
db.insert(TABLE_NAME, null, values);
db.close();
}
}
为什么我的日期值在数据库中总是空的?文本字段的输入格式为 MM/dd/yyyy for date.
我遇到过一次这个问题,当时我疯了,我的特殊问题是日期的格式。
首先再次检查这一行,并确保它具有获取值:
字符串日期 = tfDate.getText().toString();
如果正确,在插入数据库之前将日期格式化为"yyyy-MM-dd"。
类似的东西(内部任务 class):
public String getDateStr()
{
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String date = dateFormat.format(this.TaskDate);
return date;
}
我试了很多方法。我试图通过格式化为 yyyy-MM-dd 来插入日期。但是它不能正常工作。
The best way to do it are:
1-将Taskclass的taskDate属性的数据类型转换为String,而数据库中的数据类型为Date。但这是一种推荐的方式。效果很好。
2- 在数据库中将日期存储为 BIGINT。因此,Task class 的 属性 的数据类型将为 Long。这也是推荐的方式。
I used the first option.
我绝对是 Android 的初学者。我在处理 Android 中的日期时遇到问题。现在我将一个值从 EditText 字段插入到 SQLite table 列,该列是日期数据库日期。添加到数据库时它始终为空。我的代码有什么问题?
我的数据库助手class
public class DatabaseHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "todo.db";
private static final String TABLE_NAME = "task";
private static final String COLUMN_ID = "id";
private static final String COLUMN_DESCRIPTION = "description";
private static final String COLUMN_DATE ="date";
private static final String COLUMN_DONE = "done";
private static final String CREATE_TABLE = "CREATE TABLE "+TABLE_NAME+" ("+COLUMN_ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"+COLUMN_DESCRIPTION+" TEXT,"+
COLUMN_DATE+" DATE,"+COLUMN_DONE+" BOOLEAN)";
SQLiteDatabase db;
public DatabaseHelper(Context context)
{
super(context,DATABASE_NAME,null,DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
this.db = db;
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String query = "DROP TABLE IF EXISTS "+TABLE_NAME;
db.execSQL(query);
this.onCreate(db);
}
public void insertTask(Task task)
{
db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_DESCRIPTION,task.getDescription());
values.put(COLUMN_DATE,task.getDate().toString());
values.put(COLUMN_DONE,Boolean.FALSE.toString());
db.insert(TABLE_NAME, null, values);
db.close();
}
}
这是我在Fragment中的保存方法
public void saveTask()
{
String description = tfDescription.getText().toString();
String date = tfDate.getText().toString();
if(description.isEmpty())
{
Toast.makeText(getActivity().getBaseContext(),"Description is required",Toast.LENGTH_SHORT).show();
}
else if(date.isEmpty())
{
Toast.makeText(getActivity().getBaseContext(),"Date is required",Toast.LENGTH_SHORT).show();
}
else if(description.length()<getResources().getInteger(R.integer.min_description_length))
{
String minChar = String.valueOf(getResources().getInteger(R.integer.min_description_length));
Toast.makeText(getActivity().getBaseContext(),"Description should be minium "+minChar+" characters",Toast.LENGTH_SHORT).show();
}
else{
//check date
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
boolean parseOk = false;
Date taskDate = new Date();
try{
taskDate = format.parse(date);
Task task = new Task();
task.setDescription(description);
task.setDate(taskDate);
dbHelper.insertTask(task);
parseOk = true;
}
catch(ParseException e)
{
parseOk = false;
}
if(parseOk)
{
//insert task to database
Toast.makeText(getActivity().getBaseContext(),"Task saved",Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(getActivity().getBaseContext(),"Invalid date format",Toast.LENGTH_SHORT).show();
}
}
}
这是我的任务class
public class Task {
private int Id;
private String Description;
private java.util.Date TaskDate;
private boolean Done;
public void setId(int Id)
{
this.Id = Id;
}
public int getId()
{
return this.Id;
}
public void setDescription(String Description)
{
this.Description = Description;
}
public String getDescription()
{
return this.Description;
}
public void setDate(Date taskDate)
{
this.TaskDate = taskDate;
}
public Date getDate(){
return this.TaskDate;
}
public void setDone(Boolean done)
{
this.Done = done;
}
public Boolean getDone()
{
return this.Done;
}
}
这是我完整的 DatabaseHelper class
public class DatabaseHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "todo.db";
private static final String TABLE_NAME = "task";
private static final String COLUMN_ID = "id";
private static final String COLUMN_DESCRIPTION = "description";
private static final String COLUMN_DATE ="date";
private static final String COLUMN_DONE = "done";
private static final String CREATE_TABLE = "CREATE TABLE "+TABLE_NAME+" ("+COLUMN_ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"+COLUMN_DESCRIPTION+" TEXT,"+
COLUMN_DATE+" DATE,"+COLUMN_DONE+" BOOLEAN)";
SQLiteDatabase db;
public DatabaseHelper(Context context)
{
super(context,DATABASE_NAME,null,DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
this.db = db;
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String query = "DROP TABLE IF EXISTS "+TABLE_NAME;
db.execSQL(query);
this.onCreate(db);
}
public void insertTask(Task task)
{
db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_DESCRIPTION,task.getDescription());
values.put(COLUMN_DATE,task.getDate().toString());
values.put(COLUMN_DONE,Boolean.FALSE.toString());
db.insert(TABLE_NAME, null, values);
db.close();
}
}
为什么我的日期值在数据库中总是空的?文本字段的输入格式为 MM/dd/yyyy for date.
我遇到过一次这个问题,当时我疯了,我的特殊问题是日期的格式。 首先再次检查这一行,并确保它具有获取值: 字符串日期 = tfDate.getText().toString();
如果正确,在插入数据库之前将日期格式化为"yyyy-MM-dd"。
类似的东西(内部任务 class):
public String getDateStr()
{
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String date = dateFormat.format(this.TaskDate);
return date;
}
我试了很多方法。我试图通过格式化为 yyyy-MM-dd 来插入日期。但是它不能正常工作。
The best way to do it are:
1-将Taskclass的taskDate属性的数据类型转换为String,而数据库中的数据类型为Date。但这是一种推荐的方式。效果很好。
2- 在数据库中将日期存储为 BIGINT。因此,Task class 的 属性 的数据类型将为 Long。这也是推荐的方式。
I used the first option.