在 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)。
因此,要对 id 和 date_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):-
【讨论】:
以上是关于在 Android 中插入 datetime.now SQLite的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 中插入 datetime.now SQLite