【问题标题】:Insert datetime.now SQLite in Android在 Android 中插入 datetime.now SQLite
【发布时间】: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());
    }
}

【问题讨论】:

    标签: java android sqlite datetime


    【解决方案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 应用进一步的规则,即该值必须大于曾经使用过的最大值)

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

    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):-

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-09
      • 2016-05-27
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多