【问题标题】:SQLite: store an empty value in a column type of long?SQLite:在长列类型中存储一个空值?
【发布时间】:2018-06-05 22:23:10
【问题描述】:

我有一个包含 CardView 的 RecyclerView 列表的应用程序。当用户输入一些数据时会创建一个 CardView,然后将数据保存在 SQLite 数据库中。当用户使用 Datepicker 为单个 CardView 输入日期时,SQLite 列“COLUMN_NOTIFTIME”使用模型类中的长“notiftime”保存系统时间(System.currentTimeMillis() + 2 小时)。我使用“notiftime”为用户触发通知。如果用户没有为 CardView 输入日期,我希望“COLUMN_NOTIFTIME”保持一个空值或其他一些指示符来显示没有数据。我知道 long 不能为空。那么,在用户没有为 CardView 输入任何日期的情况下,如何保存某种类型的值或指示符以显示“notiftime”为空?或者我应该将长“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" + ")";    
}

【问题讨论】:

  • 在这种情况下您可以存储 0 或 -1。然后你可以添加条件来检查它是否不是 0/-1。
  • @Psypher 很好,我会用。干杯。

标签: android sqlite null long-integer


【解决方案1】:

由于 SQLite 的灵活性,您可以存储任何您希望的值(除了 rowid 的别名,即您的 ID 列,您可以在任何类型的列中存储任何类型的值)。

您可以通过不为列指定值来存储空值(只要它没有使用 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 可能有效时)。

【讨论】:

  • 我喜欢简单的方式,使用-1,这清楚地表明它不是系统时间长。我很欣赏完整的解释,回答赞成并接受。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 2016-02-14
相关资源
最近更新 更多