16

我正在开发一个 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 的形式在通用协调时间中存储了一个时间戳。

所以现在将它翻译成 java 用于 android 应用程序,我使用下面的代码。这样,当调用 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 上显示它。我注意到 time('now') 被视为字符串而不是函数。为了证明 time('now') 函数有效,我使用 time('now') 手动插入了一个新行作为 timeStamp 值。然后重新选择所有列以再次显示它们。它成功地将时间戳打印为 HH:MM:SS。

我在想环境可能会有所不同?bash shell 可以识别函数 time('now'),它是用 c 编写的,对吧?因为我在 bash 中有 sqlite3 程序?然而,在 Eclipse 中,当我使用 SQL 数据库并使用插入时,它会将时间('now')视为字符串。请记住,我正在使用 Windows 7 操作系统。我从作为主机的学校作为客户端(SSH Secure Shell)访问 bash。

我的主要问题是可以对其进行编码,以便它识别时间('现在')函数吗?

4

1 回答 1

22

由于该列的默认值是 CURRENT_TIMESTAMP,如果您完全忽略这一行会怎样:

contentValues.put( COLUMN_TIME_STAMP, " time('now') " );

现在默认情况下不会将当前时间戳插入该列吗?

于 2013-05-31T19:10:22.227 回答