복붙노트

[SQL] 안드로이드 SQLite는의 날짜와 작업에 가장 좋은 방법은 [마감]

SQL

안드로이드 SQLite는의 날짜와 작업에 가장 좋은 방법은 [마감]

내가 SQLite는을 사용하여 내 안드로이드 응용 프로그램에 날짜와 함께 작업 몇 가지 문제가 있어요. 나는 몇 가지 질문이있다 :

해결법

  1. ==============================

    1.당신은 SQLite는 내 날짜를 저장하기 위해 텍스트 필드를 사용할 수 있습니다.

    당신은 SQLite는 내 날짜를 저장하기 위해 텍스트 필드를 사용할 수 있습니다.

    날짜 열을 기준으로 다음 정렬 수 UTC 형식으로 날짜를 저장, 기본 당신은 날짜 ( '지금') (SS : mm YYYY-MM-DD HH)를 사용하는 경우.

    일정 또는 android.text.format.DateUtils.formatDateTime 방법을 사용하여 로컬 regionalised 형식으로 필요에 따라 SQLite는에서 문자열은 다음 형식 / 변환 할 수 있습니다으로 날짜를 가져.

    여기 내가 사용하십시오 regionalised 포맷 방법이다;

    public static String formatDateTime(Context context, String timeToFormat) {
    
        String finalDateTime = "";          
    
        SimpleDateFormat iso8601Format = new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss");
    
        Date date = null;
        if (timeToFormat != null) {
            try {
                date = iso8601Format.parse(timeToFormat);
            } catch (ParseException e) {
                date = null;
            }
    
            if (date != null) {
                long when = date.getTime();
                int flags = 0;
                flags |= android.text.format.DateUtils.FORMAT_SHOW_TIME;
                flags |= android.text.format.DateUtils.FORMAT_SHOW_DATE;
                flags |= android.text.format.DateUtils.FORMAT_ABBREV_MONTH;
                flags |= android.text.format.DateUtils.FORMAT_SHOW_YEAR;
    
                finalDateTime = android.text.format.DateUtils.formatDateTime(context,
                when + TimeZone.getDefault().getOffset(when), flags);               
            }
        }
        return finalDateTime;
    }
    
  2. ==============================

    2.가장 좋은 방법은 달력 명령을 사용하여받은 숫자로 날짜를 저장하는 것입니다.

    가장 좋은 방법은 달력 명령을 사용하여받은 숫자로 날짜를 저장하는 것입니다.

    //Building the table includes:
    StringBuilder query=new StringBuilder();
    query.append("CREATE TABLE "+TABLE_NAME+ " (");
    query.append(COLUMN_ID+"int primary key autoincrement,");
    query.append(COLUMN_DATETIME+" int)");
    
    //And inserting the data includes this:
    values.put(COLUMN_DATETIME, System.currentTimeMillis()); 
    

    이 왜? 우선, 날짜 범위에서 값을 얻는 것은 쉽다. 그냥 쿼리를 적절하게 다음 밀리 초 단위로 날짜를 변환합니다. 날짜별로 정렬하면 유사 쉽다. 내가 포함 등 다양한 포맷 간의 변환하는 호출은, 마찬가지로 쉽게도 있습니다. 결론은이 방법으로, 당신은 당신이 할 아무런 문제가 필요하지 무엇이든 할 수있다. 원시 값을 읽을 약간 어려울 수 있지만, 더 머신 쉽게 읽을 수 및 사용할 수있는과 그 약간의 단점 구성하는 것보다됩니다. 그리고 사실, 그것은 상대적으로 쉽게 독자를 구축하는 것입니다 (그리고 일부가 거기 알고) 자동으로 읽기 쉽게하기위한 같은 날짜에 시간 태그를 변환 할 것이다.

    이 나올 값이 긴 int로하지해야한다는 언급 그것의 가치. SQLite는의 정수 1 ~ 8 바이트에서 많은 것을, 아무 의미도 있지만, 거의 모든 날짜 64 비트, 또는 오랫동안 작품, 무엇을 할 수 있습니다.

    편집 : 바와 같이 의견에서 지적하고있다, 당신은이 작업을 수행 할 경우 제대로 타임 스탬프를 얻기 위해 cursor.getLong ()를 사용합니다.

  3. ==============================

    3.항상 기본 (즉 장치의) 시간대를 사용하는 java.util.Calendar 및 java.text.SimpleDateFormat에 작업 특히 때 UTC / GMT 시간을 저장해야합니다. java.util.Date.Date ()는 그것이 UTC 값을 생성으로 사용하는 것이 안전합니다.

    항상 기본 (즉 장치의) 시간대를 사용하는 java.util.Calendar 및 java.text.SimpleDateFormat에 작업 특히 때 UTC / GMT 시간을 저장해야합니다. java.util.Date.Date ()는 그것이 UTC 값을 생성으로 사용하는 것이 안전합니다.

  4. ==============================

    4.SQLite는 실제 또는 저장 기간에 대한 데이터 유형 정수, 텍스트를 사용할 수 있습니다. 쿼리를 수행 할 때마다 더욱, 그 결과를 포맷을 사용하여 나타낸다 % Y- % M- % D % H % M : %의 S.

    SQLite는 실제 또는 저장 기간에 대한 데이터 유형 정수, 텍스트를 사용할 수 있습니다. 쿼리를 수행 할 때마다 더욱, 그 결과를 포맷을 사용하여 나타낸다 % Y- % M- % D % H % M : %의 S.

    당신이 SQLite는 날짜 / 시간 함수를 사용하여 / 업데이트 날짜 / 시간 값을 삽입 할 경우 지금, 당신은 실제로 밀리 초를 저장할뿐만 아니라 수 있습니다. 그런 경우, 그 결과를 포맷을 사용하여 나타낸다 % Y- % M- % D % H % M : %의 F. 예를 들면 :

    sqlite> create table test_table(col1 text, col2 real, col3 integer);
    sqlite> insert into test_table values (
                strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123'),
                strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123'),
                strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123')
            );
    sqlite> insert into test_table values (
                strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.126'),
                strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.126'),
                strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.126')
            );
    sqlite> select * from test_table;
    2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
    2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126
    

    우리가 실제로 시간을 비교할 수 있다면 이제, 일부 쿼리를 수행하면 확인합니다 :

    sqlite> select * from test_table /* using col1 */
               where col1 between 
                   strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.121') and
                   strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.125');
    2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
    

    당신은 COL2와 COL3를 사용하여 동일한 SELECT를 확인하실 수 있습니다 동일한 결과를 얻을 수 있습니다. 당신이 볼 수 있듯이, 두 번째 행 (126 밀리 초) 반환되지 않습니다.

    BETWEEN 따라서 포함입니다 주 ...

    sqlite> select * from test_table 
                where col1 between 
                     /* Note that we are using 123 milliseconds down _here_ */
                    strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123') and
                    strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.125');
    

    ... 동일한 집합을 반환합니다.

    다른 날짜 / 시간 범위로 장난 시도하고 모든 것이 예상대로 동작합니다.

    의 strftime 기능이없는 무엇에 대해?

    sqlite> select * from test_table /* using col1 */
               where col1 between 
                   '2014-03-01 13:01:01.121' and
                   '2014-03-01 13:01:01.125';
    2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
    

    의 strftime 기능없이 밀리없이 무엇에 대해?

    sqlite> select * from test_table /* using col1 */
               where col1 between 
                   '2014-03-01 13:01:01' and
                   '2014-03-01 13:01:02';
    2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
    2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126
    

    무엇 ORDER BY에 대해?

    sqlite> select * from test_table order by 1 desc;
    2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126
    2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
    sqlite> select * from test_table order by 1 asc;
    2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
    2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126
    

    잘 작동합니다.

    마지막으로, 프로그램 내에서 실제 작업을 처리 할 때 (SQLite는 실행 파일을 사용하지 않고 ...)

    BTW : 나는 xerial에서 ... (하지 않도록 다른 언어에 대한) SQLite는-JDBC 드라이버 v3.7.2을 JDBC를 사용하고 있습니다 - 아마 새로운 버전이 동작은 아래에 설명 변경 ... 당신이 안드로이드 개발하는 경우, 당신은 JDBC 드라이버가 필요하지 않습니다. 모든 SQL 작업은 SQLiteOpenHelper를 사용하여 제출 할 수있다.

    java.sql.Date, java.sql.Time 오브젝트와의 java.sql.Timestamp : JDBC 데이터베이스에서 실제 날짜 / 시간 값을 얻을 수있는 다른 방법이있다.

    java.sql.ResultSet의 종래의 방법은 (명백하게) GETDATE (..), 다음 getTime (...) 및 getTimestamp () 각각.

    예를 들면 :

    Statement stmt = ... // Get statement from connection
    ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_TABLE");
    while (rs.next()) {
        System.out.println("COL1 : "+rs.getDate("COL1"));
        System.out.println("COL1 : "+rs.getTime("COL1"));
        System.out.println("COL1 : "+rs.getTimestamp("COL1"));
        System.out.println("COL2 : "+rs.getDate("COL2"));
        System.out.println("COL2 : "+rs.getTime("COL2"));
        System.out.println("COL2 : "+rs.getTimestamp("COL2"));
        System.out.println("COL3 : "+rs.getDate("COL3"));
        System.out.println("COL3 : "+rs.getTime("COL3"));
        System.out.println("COL3 : "+rs.getTimestamp("COL3"));
    }
    // close rs and stmt.
    

    SQLite는 실제 날짜 / 시간을 가지고 있지 않기 때문에 / TIMESTAMP 데이터는 객체가 0으로 초기화 것처럼이 모든 방법에는 3 값을 반환 입력 :

    new java.sql.Date(0)
    new java.sql.Time(0)
    new java.sql.Timestamp(0)
    

    그래서, 질문은 우리가 실제로 삽입 또는 갱신 날짜 / 시간 / 타임 스탬프 개체를 선택할 수 있습니까? 쉬운 답은 없다. 서로 다른 조합을 시도 할 수 있지만 모든 SQL 문에 포함 SQLite는 기능에 강제 할 것이다. 그것은 당신의 자바 프로그램 내에서 날짜 개체에 텍스트를 변환하는 유틸리티 클래스를 정의하는 것이 훨씬 쉽다. 그러나 항상 SQLite는이 UTC + 0000에 대한 날짜 값을 변환 기억 해요.

    요약하면, 일반적에도 불구하고 항상 올바른 데이터 유형 또는 유닉스 시간 (에폭 (epoch) 이후 밀리 초)을 나타내는, 심지어 정수를 사용하려면, 나는 기본 SQLite는 형식 ( '% Y- % M- % D % H를 사용하여 훨씬 쉽게 찾을 수 있습니다 : %의 M : % f를 '또는 Java로'YYYY-MM-DD HH : mm : ss.SSS ')은 오히려 SQLite는 기능을 가진 모든 SQL 문을 복잡하게합니다. 이전 방식은 유지하기가 훨씬 쉽다.

    TODO : (더 나은 API15 또는) 안드로이드 내부 GETDATE / 다음 getTime / getTimestamp를 사용할 때 나는 ... 결과를 확인합니다 어쩌면 내부 드라이버 SQLite는-JDBC 다른 ...

  5. ==============================

    5.(나는 MySQL은 / ​​포스트 그레스에서와 같은) 보통 나는 INT (MySQL은 / ​​포스트) 또는 타임 스탬프 형식으로 저장할 수있는 텍스트 (SQLite는)의 날짜를 저장합니다.

    (나는 MySQL은 / ​​포스트 그레스에서와 같은) 보통 나는 INT (MySQL은 / ​​포스트) 또는 타임 스탬프 형식으로 저장할 수있는 텍스트 (SQLite는)의 날짜를 저장합니다.

    그럼 난 Date 객체로 변환하고 사용자의 시간대에 따라 작업을 수행합니다

  6. ==============================

    6.SQLite는 DB에 데이터를 저장하는 가장 좋은 방법은 현재 날짜 시간 (밀리 초)을 저장하는 것입니다. 다음은 so_을 할 수있는 코드입니다

    SQLite는 DB에 데이터를 저장하는 가장 좋은 방법은 현재 날짜 시간 (밀리 초)을 저장하는 것입니다. 다음은 so_을 할 수있는 코드입니다

    public static long getTimeMillis(String dateString, String dateFormat) throws ParseException {
        /*Use date format as according to your need! Ex. - yyyy/MM/dd HH:mm:ss */
        String myDate = dateString;//"2017/12/20 18:10:45";
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat/*"yyyy/MM/dd HH:mm:ss"*/);
        Date date = sdf.parse(myDate);
        long millis = date.getTime();
    
        return millis;
    }
    
    public void insert(Context mContext, long dateTimeMillis, String msg) {
        //Your DB Helper
        MyDatabaseHelper dbHelper = new MyDatabaseHelper(mContext);
        database = dbHelper.getWritableDatabase();
    
        ContentValues contentValue = new ContentValues();
        contentValue.put(MyDatabaseHelper.DATE_MILLIS, dateTimeMillis);
        contentValue.put(MyDatabaseHelper.MESSAGE, msg);
    
        //insert data in DB
        database.insert("your_table_name", null, contentValue);
    
       //Close the DB connection.
       dbHelper.close(); 
    
    }
    

    지금, 당신의 데이터 (날짜 전에 currentTimeMillis 초입니다) DB에 삽입 얻을됩니다.

    다음 단계는 DB에서 데이터를 검색 할 때 날짜를 대응하는에 각각의 날짜 시간 (밀리 초)을 변환 할 필요가있다. 아래는 same_을 할 수있는 간단한 코드가있다

    public static String getDate(long milliSeconds, String dateFormat)
    {
        // Create a DateFormatter object for displaying date in specified format.
        SimpleDateFormat formatter = new SimpleDateFormat(dateFormat/*"yyyy/MM/dd HH:mm:ss"*/);
    
        // Create a calendar object that will convert the date and time value in milliseconds to date.
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(milliSeconds);
        return formatter.format(calendar.getTime());
    }
    
    public ArrayList<String> fetchData() {
    
        ArrayList<String> listOfAllDates = new ArrayList<String>();
        String cDate = null;
    
        MyDatabaseHelper dbHelper = new MyDatabaseHelper("your_app_context");
        database = dbHelper.getWritableDatabase();
    
        String[] columns = new String[] {MyDatabaseHelper.DATE_MILLIS, MyDatabaseHelper.MESSAGE};
        Cursor cursor = database.query("your_table_name", columns, null, null, null, null, null);
    
        if (cursor != null) {
    
            if (cursor.moveToFirst()){
                do{
                    //iterate the cursor to get data.
                    cDate = getDate(cursor.getLong(cursor.getColumnIndex(MyDatabaseHelper.DATE_MILLIS)), "yyyy/MM/dd HH:mm:ss");
    
                    listOfAllDates.add(cDate);
    
                }while(cursor.moveToNext());
            }
            cursor.close();
    
        //Close the DB connection.
        dbHelper.close(); 
    
        return listOfAllDates;
    
    }
    

    이 모두 도움이 될 것입니다 희망! :)

  7. ==============================

    7.-Exactly StErMi 같은 일 밝혔다.

    -Exactly StErMi 같은 일 밝혔다.

    이 -이 읽어 보시기 바랍니다 : http://www.vogella.de/articles/AndroidSQLite/article.html

    3 -

    Cursor cursor = db.query(TABLE_NAME, new String[] {"_id", "title", "title_raw", "timestamp"}, 
                    "//** YOUR REQUEST**//", null, null, "timestamp", null);
    

    여길 봐:

    의 SQLiteDatabase의 쿼리 ()

    4 - 참조 답변 3

  8. ==============================

    8.나는이 선호합니다. 이것은 가장 좋은 방법,하지만 빠른 해결책이 아니다.

    나는이 선호합니다. 이것은 가장 좋은 방법,하지만 빠른 해결책이 아니다.

    //Building the table includes:
    StringBuilder query= new StringBuilder();
    query.append("CREATE TABLE "+TABLE_NAME+ " (");
    query.append(COLUMN_ID+"int primary key autoincrement,");
    query.append(COLUMN_CREATION_DATE+" DATE)");
    
    //Inserting the data includes this:
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    values.put(COLUMN_CREATION_DATE,dateFormat.format(reactionGame.getCreationDate())); 
    
    // Fetching the data includes this:
    try {
       java.util.Date creationDate = dateFormat.parse(cursor.getString(0);
       YourObject.setCreationDate(creationDate));
    } catch (Exception e) {
       YourObject.setCreationDate(null);
    }
    
  9. ==============================

    9.

    "SELECT  "+_ID+" ,  "+_DESCRIPTION +","+_CREATED_DATE +","+_DATE_TIME+" FROM "+TBL_NOTIFICATION+" ORDER BY "+"strftime(%s,"+_DATE_TIME+") DESC";
    
  10. from https://stackoverflow.com/questions/7363112/best-way-to-work-with-dates-in-android-sqlite by cc-by-sa and MIT license