SQLite:在long类型的列中存储一个空值?

时间:2018-06-05 22:23:11

标签: android sqlite null long-integer

我有一个带有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" + ")";    
}

1 个答案:

答案 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可能有效)。