我有一个带有RecycViewView CardViews列表的应用程序。当用户输入一些数据并且数据随后保存在SQLite数据库中时,会创建CardView。当用户为单个CardView输入带有Datepicker的日期时,SQLite列" COLUMN_NOTIFTIME"使用long" notiftime"来节省系统时间(System.currentTimeMillis()+ 2小时)。来自模型类。我使用" notiftime"为用户触发通知如果用户没有输入CardView的日期,我希望" COLUMN_NOTIFTIME"保持空值或其他指示符以显示没有数据。我理解长期不能为空。那么如何保存某种类型的值或指标以显示" notiftime"对于用户未输入该CardView的任何日期的情况,该项为空?或者我应该改变漫长的" notiftime"到一个String并格式化系统时间+ 2小时到一个字符串,以便我可以使用NULL,isEmpty(),isNull()和putNull()?
Model class:
public class CardViewItem {
private int id;
private String duedate;
private String duetime;
private long notiftime;
}
DB class:
public class SQLiteDB extends SQLiteOpenHelper {
...
private static final String SQL_CREATE_ENTRIES =
"CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_DUEDATE + " TEXT," +
COLUMN_DUETIME + " TEXT," +
COLUMN_NOTIFTIME + " INTEGER" + ")";
}
答案 0 :(得分:1)
由于SQLite的灵活性,你可以存储任何你想要的值(除了rowid的别名之外,你可以在任何类型的列中存储任何类型的值)。
您可以通过不指定列的值来存储null(只要它没有使用NOT NULL约束定义),这将需要指定要插入的列。
因此,在您的情况下,用于插入的SQL必须等同于: -
INSERT INTO your_table (due_date_column_name,due_time_column_name) VALUES('2018-01-01','10:30');
使用insert方法,这将是: -
ContentValues cv = new ContentValues();
cv.put(COLUMN_DUEDATE,"2018-01-01");
cv.put(COLUMN_DUETIME,"10:00");
long inserted_id = db.insert(TABLE_NAME,null,cv);
而不是: -
ContentValues cv = new ContentValues();
cv.put(COLUMN_DUEDATE,"2018-01-01");
cv.put(COLUMN_DUETIME,"10:00");
cv.putCOLUMN_NOTIFTIME,calculated_notiftime_as_long);
long inserted_id = db.insert(TABLE_NAME,null,cv);
然而最简单的方法是存储一个逻辑上无效的长,因此很容易检测到,相同的日期时间(因此截止日期+ due_time - notiftime = 0),0可能是最简单的,-1也经常被用来表示什么(通常当0可能有效)。