我正在开发一个Android应用程序,我正在创建一个名为HealthDev.db的数据库,它有一个名为rawData的表,它有4列: _id,foreignUserId,data,timeStamp
我使用过bash shell中的程序sqlite3,并且发现我可以使用以下列架构参数的时间戳列: timeStamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
所以当我创建我使用的表时: create table rawData(_id integer primary key autoincrement,foreignUserId integer,data real,timeStamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
这在bash中运行良好。
然后我在sqlite3中练习并且知道当插入timeStamp列并使用函数time('now')作为存储它的值实际上存储时间戳为HH:MM:SS在Universal Coordinated中时间。
所以现在将其转换为java for android app,我使用下面的代码。这样,当调用onCreate时,表会自动生成大约20行。如果我在java中正确地传递时间('now'),这只是用于测试。
// Below are variables to the database table name and the
// database column names.
public static final String TABLE_RAW_DATA = "rawData";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_FOREIGN_USER_ID = "foreignUserId";
public static final String COLUMN_DATA = "data";
public static final String COLUMN_TIME_STAMP = "timeStamp";
// Database creation sql statement.
private static final String DATABASE_CREATE = "create table "
+ TABLE_RAW_DATA
+ "("
+ COLUMN_ID + " integer primary key autoincrement, "
+ COLUMN_FOREIGN_USER_ID + " integer, "
+ COLUMN_DATA + " real, "
+ COLUMN_TIME_STAMP + " TIMESTAMP DEFAULT CURRENT_TIMESTAMP"
+ ");";
// initializes the columns of the database given by passing the DATABASE_CREATE
// sql statement to the incoming database.
public static void onCreate(SQLiteDatabase database) {
database.execSQL(DATABASE_CREATE);
// For testing
ContentValues contentValues = new ContentValues();
System.out.println("The database is open? " + database.isOpen());
for (int i = 0; i < 20; i++)
{
contentValues.put( COLUMN_FOREIGN_USER_ID, 8976);
contentValues.put( COLUMN_DATA, Math.random()*100 );
contentValues.put( COLUMN_TIME_STAMP, " time('now') " );
database.insert( TABLE_RAW_DATA, null, contentValues );
//contentValues = new ContentValues();
}
}
在eclipse模拟器中运行此代码之后,我在DDMS视图模式下从eclipse android项目中的文件资源管理器中提取数据库文件。然后我在bash shell中打开数据库,然后选择表rawData中的所有列以在shell上显示它。我注意到时间('now')被视为字符串而不是函数。为了证明time('now')函数有效,我使用time('now')为timeStamp值手动插入一个新行。然后重新选择所有列以再次显示它们。它成功地将时间戳打印为HH:MM:SS。
我在想环境可能有所不同? bash shell识别函数时间('now'),这是用c写的吗?因为我在bash中有sqlite3程序?然而在eclipse中,当我使用SQL数据库并使用插入时,它将时间('now')视为字符串。请记住,我在Windows 7操作系统中工作。我作为客户端(SSH Secure Shell)从我的学校(主机)访问bash。
我的主要问题是可以对它进行编码,以便识别时间('现在')函数吗?
答案 0 :(得分:21)
由于该列的默认值为CURRENT_TIMESTAMP,如果您完全忽略该行,该怎么办:
contentValues.put( COLUMN_TIME_STAMP, " time('now') " );
它现在默认将当前时间戳插入该列?