在 Android 中插入 datetime.now SQLite

Posted

技术标签:

【中文标题】在 Android 中插入 datetime.now SQLite【英文标题】:Insert datetime.now SQLite in Android 【发布时间】:2021-12-03 11:09:02 【问题描述】:

我对如何在 SQLite 数据库中插入 DateTime.now 感到困惑,我想使用并插入 DateTime,大多数示例使用 ContentValues 但我想通过使用 SQLIteStatement 插入,如下例所示,这可能吗?

声明数据库存在日期时间在最后一列

sqLiteHelper.queryData("CREATE TABLE IF NOT EXISTS CgList(Id INTEGER PRIMARY KEY AUTOINCREMENT, cash_card_actual_no VARCHAR, hh_number VARCHAR,series_number VARCHAR, cc_image BLOB , id_image BLOB, cash_card_scanned_no VARCHAR , card_scanning_status VARCHAR, date_insert DATETIME DEFAULT CURRENT_TIMESTAMP)");

我想在插入数据时添加另一列DateTime,它会自动保存日期。

public void insertScannedCashCard(String scannedCashCard,byte[] cc_image)

    try 
        SQLiteDatabase database = getWritableDatabase();
        String sql = "INSERT INTO CgList VALUES (NULL,?,?,?,?,?,?,0)";
        SQLiteStatement statement = database.compileStatement(sql);
        statement.clearBindings();
        statement.bindString(1, "");
        statement.bindString(2, "");
        statement.bindString(3, "");
        statement.bindBlob(4, cc_image);
        statement.bindString(5,"");
        statement.bindString(6, scannedCashCard);
        statement.executeInsert();
    
    catch(Exception e)
        Log.v(TAG,e.toString());
    

这是我尝试过的

    public void insertScannedCashCard(String scannedCashCard,byte[] cc_image)

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String strDate = sdf.format(new Date());
    try 
        SQLiteDatabase database = getWritableDatabase();
        String sql = "INSERT INTO CgList VALUES (NULL,?,?,?,?,?,?,0,?)";
        SQLiteStatement statement = database.compileStatement(sql);
        statement.clearBindings();
        statement.bindString(1, "");
        statement.bindString(2, "");
        statement.bindString(3, "");
        statement.bindBlob(4, cc_image);
        statement.bindString(5,"");
        statement.bindString(6, scannedCashCard);
        statement.bindDateeeeee(7, strDate); // don't know the syntax of date
        statement.executeInsert();
    
    catch(Exception e)
        Log.v(TAG,e.toString());
    

【问题讨论】:

【参考方案1】:

你可以使用任何一个:-

public void insertScannedCashCard(String scannedCashCard,byte[] cc_image)

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String strDate = sdf.format(new Date());
    try 
        //SQLiteDatabase database = this.getWritableDatabase();
        String sql = "INSERT INTO CgList VALUES (NULL,?,?,?,?,?,?,?,?)";
        SQLiteStatement statement = database.compileStatement(sql);
        statement.clearBindings();
        statement.bindString(1, "");
        statement.bindString(2, "");
        statement.bindString(3, "");
        statement.bindBlob(4, cc_image);
        statement.bindString(5,"");
        statement.bindString(6, scannedCashCard);
        statement.bindString(7, strDate); // don't know the syntax of date
        statement.executeInsert();
    
    catch(Exception e)
        Log.v(TAG,e.toString());
    

即日期是一个字符串。

或者,如果您希望使用 DEFAULT 值,即 CURRENT_TIMESTAMP,则使用仅指定不使用默认值的列的插入(即省略列以使用定义的 DEFAULT)。

因此,要对 iddate_insert 列都使用 DEFAULT 值,您可以使用:-

public void insertScannedCashCardV2(String scannedCashCard,byte[] cc_image)

    try 
        //SQLiteDatabase database = this.getWritableDatabase();
        String sql = "INSERT INTO CgList (cash_card_actual_no,hh_number,series_number,cc_image,id_image,cash_card_scanned_no,card_scanning_status) VALUES (?,?,?,?,?,?,0)";
        SQLiteStatement statement = database.compileStatement(sql);
        statement.clearBindings();
        statement.bindString(1, "");
        statement.bindString(2, "");
        statement.bindString(3, "");
        statement.bindBlob(4, cc_image);
        statement.bindString(5,"");
        statement.bindString(6, scannedCashCard);
        statement.executeInsert();
    
    catch(Exception e)
        Log.v(TAG,e.toString());
    

关于类型。 SQLite 在处理列的方式上是独一无二的,或者至少是不寻常的。类型亲和力将是以下之一:-

文本 整数 BLOB 真实 数字

但是,您几乎可以指定任何内容(有一些限制),甚至不指定任何内容,SQLite 将根据一组规则分配类型亲和性。

SQLite 没有特定的日期/时间类型,但将 DATETIME 指定为列类型会导致该列根据类型关联规则具有 NUMERIC 的类型关联(即应用最后一个 catch-all 规则) em>。

例如cash_card_actual_no VARCHAR 因为第一个匹配的规则是第二个规则:- 如果列的声明类型包含任何字符串“CHAR”、“CLOB”或“TEXT”,则该列具有 TEXT 关联。请注意,类型 VARCHAR 包含字符串“CHAR”,因此被分配了 TEXT 亲和性。 您甚至可以将列类型设置为 rumplestiltskin,规则会通过,并且类型关联是包罗万象的 NUMERIC。

但是,除了一个例外,SQLite 的灵活性允许任何列存储任何类型的数据。例外是特殊的 rowid 列或 rowid 列的别名。 rowid 列的别名是您指定INTEGER PRIMARY KEY(有或没有AUTOINCREMENT)的地方,在这种情况下,值必须是整数或NULL,在NULL 的情况下,值将是由 SQLite 确定(自动生成)(通常比最大值大 1,AUTOINCREMENT 应用进一步的规则,即该值必须大于曾经使用过的最大值)

请参阅Datatypes in SQLite 了解更多信息。

所以使用上面的代码和:-

insertScannedCashCard("TheCard",new byte[]0,1,2,3,4,5,6,7,8,9);
insertScannedCashCardV2("Next Card",new byte[]9,8,7,6,5,4,3,2,1,0);

然后你得到的结果(根据 android Studio 的 App Inspection aka Database Inspector):-

【讨论】:

以上是关于在 Android 中插入 datetime.now SQLite的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中插入 datetime.now SQLite

在Android中的远程数据库中插入图像路径

如何在android中插入%20代替空格

在 Android Studio 中插入数据

在 android 聊天气泡中插入 imageview 可调

python常用内建模块