2013-05-31 31 views
13

tôi đang làm việc trên một ứng dụng Android và tôi đang tạo ra một cơ sở dữ liệu được gọi là HealthDev.db có một bảng gọi là rawData có 4 cột: _id, foreignUserId, dữ liệu, timestampLàm cách nào để chèn dấu thời gian vào cột cơ sở dữ liệu SQLite? Sử dụng thời gian hàm ('now')?

Tôi đã làm việc với các chương trình trong sqlite3 vỏ bash và đã tìm ra rằng tôi có thể có một cột thời gian tem với tham số giản đồ cột sau: timestamp dấu thời gian DEFAULT CURRENT_TIMESTAMP

vì vậy khi tôi tạo ra bảng tôi đã sử dụng: tạo bảng rawData (_id nguyên chính autoincrement chính , số nguyên ForeignUserId, dữ liệu thực, timeStamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP);

Điều này hoạt động tốt trong bash.

Sau đó, tôi thực hành trong sqlite3 và biết rằng khi chèn vào cột timeStamp và sử dụng thời gian hàm ('now') làm giá trị để lưu trữ nó thực sự lưu trữ tem thời gian dưới dạng HH: MM: SS trong Universal Thời gian phối hợp.

Vì vậy, bây giờ dịch thành java cho ứng dụng android, tôi đã sử dụng mã sau đây. Bằng cách này, bảng sẽ tự động tạo ra khoảng 20 hàng khi onCreate được gọi. Đây chỉ là để thử nghiệm nếu tôi vượt qua thời gian ('bây giờ') một cách chính xác trong java.

 // 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(); 

    } 

    } 

Sau khi chạy mã này trong trình giả lập nhật ký, tôi đã lấy tệp cơ sở dữ liệu từ trình khám phá tệp trong chế độ xem DDMS cho các dự án android eclipse. Sau đó, tôi mở cơ sở dữ liệu trong một bash shell và sau đó chọn tất cả các cột từ bảng rawData để hiển thị nó trên trình bao. Tôi nhận thấy rằng thời gian ('bây giờ') được coi là một chuỗi và không phải là một hàm. Để chứng minh rằng hàm time ('now') đã làm việc, tôi đã chèn một hàng mới bằng cách sử dụng thời gian ('now') cho giá trị timeStamp. Sau đó, chọn lại tất cả các cột để hiển thị lại chúng. Nó đã in thành công dấu thời gian là HH: MM: SS.

Tôi nghĩ có thể có sự khác biệt trong môi trường? Bash shell nhận ra thời gian chức năng ('now'), được viết bằng c phải không ?, bởi vì tôi có chương trình sqlite3 trong bash? Tuy nhiên, trong nhật thực khi tôi sử dụng một cơ sở dữ liệu SQL và sử dụng chèn nó xử lý thời gian ('bây giờ') như là một chuỗi. Hãy nhớ rằng tôi đang làm việc trong một hệ điều hành Windows 7. Tôi đang truy cập vào bash như một khách hàng (SSH Secure Shell) từ trường học của tôi là chủ nhà.

Câu hỏi chính của tôi là có thể mã hóa nó sao cho nó nhận ra hàm thời gian ('bây giờ')?

Trả lời

20

Kể từ khi mặc định cho cột là CURRENT_TIMESTAMP, những gì nếu bạn bỏ qua hoàn toàn dòng này:

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

Sẽ không nó bây giờ chèn dấu thời gian hiện tại vào cột theo mặc định?

+0

Cảm ơn! Bạn là f * cken tuyệt vời! Nó hoạt động :) – fgharo91

+0

Tuyệt vời! Vui lòng 'chấp nhận' câu trả lời của tôi! :-) – mharper

+0

Để chắc chắn! Bạn có thể bỏ phiếu cho câu hỏi của tôi không? Tôi muốn tải lên một pic trong bài viết đầu tiên của tôi và tôi không thể vì tôi không có đủ danh tiếng. Lần đầu tiên đặt câu hỏi trong stackoverflow. Cảm ơn! – fgharo91

Các vấn đề liên quan