2011-03-13 3 views
5

날짜를 정수로 저장하는 Android 응용 프로그램 내에 SQLite 데이터베이스가 있습니다. 이 정수는 Java.util.Date.getTime();에 대한 호출에서 파생됩니다. Cursor를 CursorAdapter에 전달하고 ListView에 표시하려면 데이터베이스의 원시 쿼리를 실행하려고하지만 날짜는 getTime()에 의해 반환 된 정수로 저장됩니다.SQLite select 문에서 형식화 된 날짜의 서식을 정수로 지정하십시오.

내 프로그램을 간단하게 유지하려면 SimpleArrayAdapter를 사용하지 않고 CursorAdapter를 사용하고 싶습니다.

날짜 열의 정수를 mm-dd-yyyy으로 지정하여 커서가 가리키는 표의 열에 Java.util.Date.getTime();을 반환 한 정수 대신 올바른 형식의 값이 포함되도록 할 수 있습니까? 항목을 데이터베이스에 추가 하시겠습니까?

+0

대신 캘린더 메서드를 사용하지 않는 것이 좋습니다.하지만 http://developer.android.com/reference/java/util/GregorianCalendar.html – stealthcopter

+0

Matthew Flaschen 's 또는 에스라의 대답이 최선이며, 그들은 모두 정확하고 정확합니다. 도움을 주셔서 감사합니다. – finiteloop

답변

7
SELECT strftime("%m-%d-%Y", date_col, 'unixepoch') AS date_col 

결과 집합 열이 date_col이라는 형식으로 예상되는 경우 코드가 작동합니다.

편집 :주의해야 할 것은, getTime은 1970 년 이래로 밀리 초를 사용하는 반면 표준 UNIX 시간 (SQLite 포함)은 초를 사용한다는 것입니다.

+0

내 생각에 Date.getTime()/1000과 같이 데이터베이스에 값을 저장하는 것이었지만이 날짜는 strftime에서 <정확한 월>, <정확한 날짜>, <정확한 연도> + 1900으로 되돌아 왔습니다. For 예를 들어, 새로운 Date(). getTime()/1000 (오늘)이 03-12-2011 대신 03-12-3911로 표시되면 내/1000 논리에 결함이있는 것입니까? – finiteloop

+1

@segfault, 아마도'Date' 객체를 잘못 작성했을 것입니다. [생성자] (http://download.oracle.com/javase/6/docs/api/java/util/Date.html#Date%28int,%20int,%20int%29) (또는 세트) "the year from 1900." –

2

SQLite는 정적 리지드 타이핑을 사용합니다. 정적 유형 지정에서는 값의 데이터 유형이 해당 컨테이너 (값이 저장된 특정 열)에 의해 결정됩니다.

SQLite는 데이터베이스에 저장된 모든 값은 다음 저장 클래스 중 하나가 :

그래서

  1. NULL
  2. REAL
  3. INTEGER
  4. TEXT
  5. BLOB를 I 무슨 뜻인지 잘 모르겠다 but the date is stored as a long, unhelpful integer.

    자세한 내용은 Datatypes In SQLite Version 3을 참조하십시오. SQLite에 날짜/시간 저장에 대한 자세한 내용은 SQL As Understood By SQLite을 참조하십시오.

    이 정보가 도움이되기를 바랍니다.

5

Java.util.Date.getTime(); 메서드는 "unix time"을 나타내는 정수를 반환합니다.

날짜는 다음과 SQLite는 쿼리를 사용하여-이로 저장하고 읽어이기 때문에이 번호를 읽을 수있는 가장 간단한 방법 :

SELECT strftime('%m-%d-%Y', 1092941466, 'unixepoch'); 

반환

08-19-2004 

을 당신이 만약 다른 형식이 필요하다면 strftime 함수를 사용하여 원하는대로 형식을 지정하거나 사용할 수있는 다른 날짜 형식 및 함수를 사용할 수 있습니다.

Matthew Flaschen이 아래의 추천에서 지적한 것처럼, 이러한 방식으로 사용하려면 먼저 날짜를 1000으로 나누어야합니다. "실제"유닉스 시간은 신기원 이후 초 단위로 측정되며, Java.util.Date.getTime();은 신기원 이후로 밀리 초를 반환합니다..

+0

위의 select 문에 "1092941466"이 무엇인지 이해가되지 않습니다. 이 날짜를 포함하는 열의 이름이되기를 원하지 않습니까? – finiteloop

+0

예. 특히 아무것도 아닙니다. 필자의 시스템에서 예제를 테스트해야하는 유닉스 스타일의 날짜 일 뿐이다. 쿼리에서 적절한 열로 대체하려고합니다. – Ezra

+0

확인. 그 말이 맞습니다. 서식이 지정된 날짜의 열은 날짜가 저장되는 열과 동일한 이름이나 다른 이름을 갖게됩니까? 바로 지금, 내 날짜 열의 이름을 가진 열이 rawQeury에 의해 반환 된 커서 테이블에 없기 때문에이 정보를 표시하려고 할 때 내 앱이 충돌하는 것 같습니다. – finiteloop

관련 문제