SQLite:在 long 类型的列中存储一个空值?
SQLite: store an empty value in a column type of long?
我有一个带有 CardView 的 RecyclerView 列表的应用程序。当用户输入一些数据时创建 CardView,然后将数据保存在 SQLite 数据库中。当用户使用日期选择器为单个 CardView 输入日期时,SQLite 列 "COLUMN_NOTIFTIME" 使用来自模型 "notiftime" 的长 "notiftime" 保存系统时间(System.currentTimeMillis() + 2 小时) =20=]。我使用 "notiftime" 为用户触发通知。如果用户没有为 CardView 输入日期,我希望 "COLUMN_NOTIFTIME" 保留空值或其他一些指示符以表明没有数据。我知道 long 不能为空。那么,如果用户没有为该 CardView 输入任何日期,我该如何保存某种类型的值或指示符以显示 "notiftime" 为空?或者我应该只将 long "notiftime" 更改为字符串并将系统时间 + 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" + ")";
}
由于 SQLite 的灵活性,您可以存储任何您想要的值(除了 rowid 的别名,您的 ID 列是一个例外,您可以将任何类型的值存储在任何类型的列)。
您可以通过不为列指定值来存储 null(只要它没有用 NOT NULL 约束定义),这将需要指定要插入的列。
所以在你的情况下,用于插入的 SQL 必须等于 :-
INSERT INTO your_table (due_date_column_name,due_time_column_name) VALUES('2018-01-01','10:30');
使用插入方法,这将是:-
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);
然而,最简单的方法是存储逻辑上无效的 long,因此很容易检测到相同的日期时间(因此截止日期 + due_time - notiftime = 0),0 可能是最简单的,-1 也经常用于表示什么都没有(通常当 0 可能有效时)。
我有一个带有 CardView 的 RecyclerView 列表的应用程序。当用户输入一些数据时创建 CardView,然后将数据保存在 SQLite 数据库中。当用户使用日期选择器为单个 CardView 输入日期时,SQLite 列 "COLUMN_NOTIFTIME" 使用来自模型 "notiftime" 的长 "notiftime" 保存系统时间(System.currentTimeMillis() + 2 小时) =20=]。我使用 "notiftime" 为用户触发通知。如果用户没有为 CardView 输入日期,我希望 "COLUMN_NOTIFTIME" 保留空值或其他一些指示符以表明没有数据。我知道 long 不能为空。那么,如果用户没有为该 CardView 输入任何日期,我该如何保存某种类型的值或指示符以显示 "notiftime" 为空?或者我应该只将 long "notiftime" 更改为字符串并将系统时间 + 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" + ")";
}
由于 SQLite 的灵活性,您可以存储任何您想要的值(除了 rowid 的别名,您的 ID 列是一个例外,您可以将任何类型的值存储在任何类型的列)。
您可以通过不为列指定值来存储 null(只要它没有用 NOT NULL 约束定义),这将需要指定要插入的列。
所以在你的情况下,用于插入的 SQL 必须等于 :-
INSERT INTO your_table (due_date_column_name,due_time_column_name) VALUES('2018-01-01','10:30');
使用插入方法,这将是:-
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);
然而,最简单的方法是存储逻辑上无效的 long,因此很容易检测到相同的日期时间(因此截止日期 + due_time - notiftime = 0),0 可能是最简单的,-1 也经常用于表示什么都没有(通常当 0 可能有效时)。