2013-05-31 15 views
13

Pracuję nad android app i tworzę bazę danych o nazwie HealthDev.db który ma tabelę o nazwie rawData że ma 4 kolumny: _id, foreignUserId, danych timestampJak wstawić znacznik czasu do kolumny bazy danych SQLite? Używając czasu funkcji ("teraz")?

Ja pracowałem z programu w sqlite3 powłoki bash i zorientowali się, że mogę mieć kolumnę znacznika czasu z następującym parametrem schematu kolumna: timeStamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP

więc kiedy stworzył tabelę i używany: create table rawData (_id całkowitą podstawowy klucz autoIncrement , foreignUserId integer, dane prawdziwe, timeStamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP);

To działało dobrze w bash.

Potem ćwiczyłem w sqlite3 i wiem, że wstawiając do kolumny timeStamp i używając czasu funkcji ("teraz") jako wartości do przechowywania, faktycznie przechowuje znacznik czasu w postaci HH: MM: SS w Universal Skoordynowany czas.

Tak więc tłumacząc to na java dla aplikacji na Androida, użyłem następującego kodu poniżej. W ten sposób tabela automatycznie generuje około 20 wierszy po wywołaniu metody onCreate. Jest to tylko do sprawdzenia, czy poprawnie przekazuję czas ("teraz") w 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(); 

    } 

    } 

Po uruchomieniu tego kodu w emulatorze eclipse Potem wyciągnął plik bazy danych przy pomocy eksploratora plików w trybie podglądu DDMS dla Eclipse android projektów. Następnie otworzyłem bazę danych w powłoce bash, a następnie wybrałem wszystkie kolumny z tabeli rawData, aby wyświetlić ją w powłoce. Zauważyłem, że czas ("teraz") był traktowany jako ciąg, a nie funkcja. Aby udowodnić, że funkcja czasu ("teraz") zadziałała, ręcznie wstawiłem nowy wiersz, używając czasu ("teraz") dla wartości timeStamp. Następnie wybierz ponownie wszystkie kolumny, aby wyświetlić je ponownie. Udało się wydrukować znacznik czasu jako HH: MM: SS.

Myślę, że może być różnica w środowisku? Powłoka bash rozpoznaje czas funkcji ("teraz"), który został napisany w c, prawda ?, ponieważ mam program sqlite3 w bash? Jednak w czasie zaćmienia, gdy korzystam z bazy danych SQL i używam wstawki, traktuję czas ("teraz") jako ciąg znaków. Należy pamiętać, że pracuję w systemie operacyjnym Windows 7. Uzyskuję dostęp do bash jako klient (SSH Secure Shell) z mojej szkoły, która jest hostem.

Moje główne pytanie jest możliwe, aby zakodować go tak, aby rozpoznał funkcję czasu ("teraz")?

Odpowiedz

20

Ponieważ domyślne dla kolumny jest CURRENT_TIMESTAMP co jeśli pominąć całkowicie tę linię:

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

nie będzie to teraz wstawić aktualny timestamp do tej kolumny domyślnie?

+0

Dzięki! Jesteś f * cken niesamowity! Zadziałało :) – fgharo91

+0

Świetnie! Zapraszam do "zaakceptowania" mojej odpowiedzi! :-) – mharper

+0

Na pewno! Czy mógłbyś w zamian oddać moje pytanie? Chciałem załadować zdjęcie w moim pierwszym poście i nie mogłem, ponieważ nie miałem dość reputacji. Pierwszy raz zadaje pytania w stackoverflow. Dzięki! – fgharo91