猿问

我应该如何从绑定到文本视图的数据库中获取长类型日期作为格式正确的日期?

我将我的日期以毫秒为单位存储到我的数据库中。稍后,我尝试从数据库中加载它,并使用 SimpleCursorAdapter 将其加载到文本视图中。但是,每次我调用它时,我都会将毫秒返回为字符串,因此当我将它绑定到文本视图时,我看到的不是正确的格式,而是毫秒。


变量:


    public static final String COL_ID = "_id";

    public static final String COL_DATE = "date";

    public static final String COL_CONTENT = "content";

    public static final String COL_IMPORTANT = "important";


    private static final int INDEX_ID = 0;

    public static final int INDEX_DATE = INDEX_ID + 1;

    public static final int INDEX_CONTENT = INDEX_ID + 2;

    public static final int INDEX_IMPORTANT = INDEX_ID+ 3;

在数据库适配器中创建函数:


    public void createEvent(long day, String name, boolean important) {

        ContentValues values = new ContentValues();

        values.put(COL_DATE, day);

        values.put(COL_CONTENT, name);

        values.put(COL_IMPORTANT, important ? 1 : 0);

        mDb.insert(TABLE_NAME, null, values);

    }

建表查询:


    private static final String DATABASE_CREATE =

            "CREATE TABLE if not exists " + TABLE_NAME + " ( " +

                    COL_ID + " INTEGER PRIMARY KEY autoincrement, " +

                    COL_DATE + " INTEGER, " +

                    COL_CONTENT + " TEXT, " +

                    COL_IMPORTANT + " INTEGER );";

我的活动电话:



        mDbAdapter = new EventsDbAdapter(this);

        mDbAdapter.open();

        Cursor cursor = mDbAdapter.fetchAllEvents();

        String[] from = new String[] {EventsDbAdapter.COL_DATE, EventsDbAdapter.COL_CONTENT};

        int[] to = new int[] {R.id.event_list_row_dayTextView, R.id.event_list_row_dataTextView};

        mCursorAdapter = new EventsSimpleCursorAdapter(

                CalendarActivity.this,

                R.layout.event_feed_item_row,

                cursor,

                from,

                to,

                0);

        mListView.setAdapter(mCursorAdapter);

梦里花落0921
浏览 81回答 1
1回答

肥皂起泡泡

我相信您可以更改fetchAllEvents方法以返回一个游标,其中包含根据需要格式化的日期,作为附加列(因此您不需要转换/格式化任何您想要的值直接提供)。这可能基于使用strftime('%d'," + COL_DATE + " / 1000,'unixepoch'). 这 :-获取 COL_DATE 中的值并将其除以 1000 以降低毫秒数,将值修改为 unix 时间,而不是儒略日。使用%d格式化程序格式化值 DD 格式。您的fecthAllEvents方法可能类似于:-public Cursor fetchAllEvents() {    SQLiteDatabase db = this.getWritableDatabase();    String[] columns = new String[]{"*","strftime('%d'," + COL_DATE + " / 1000,'unixepoch') AS date_as_DD"}; //<<<<<<<<<< this gets the day of the month DD from the timestamp    return db.query(TABLE_NAME,columns,null,null,null,null,null);}然后,适配器可以将列date_as_DD作为字符串从 Cursor 中检索。注意上面的代码是原理代码。它没有经过语法检查或运行,因此可能包含一些错误。请注意,如果您想要 10 天以内的单个数字,则可以修改上面的内容以使用CAST(strftime('%d',date/1000,'unixepoch') AS INTEGER) AS date_as_DD(即强制使用 INTEGER 类型而不是 TEXT 类型)。测试以上内容基于以下测试代码:-DROP TABLE IF EXISTS mytable;CREATE TABLE IF NOT EXISTS mytable (_id INTEGER PRIMARY KEY, date INTEGER, content TEXT, important INTEGER);-- add some data with unix dates with milliseconds (i.e. * 1000)INSERT INTO mytable (date,content,important) VALUES(strftime('%s','now') * 1000,'blah',0);INSERT INTO mytable (date,content,important) VALUES(strftime('%s','now','-1 Day') * 1000,'blah',0);INSERT INTO mytable (date,content,important) VALUES(strftime('%s','now','-7 Day') * 1000,'blah',0);INSERT INTO mytable (date,content,important) VALUES(strftime('%s','now','-10 Day') * 1000,'blah',0);INSERT INTO mytable (date,content,important) VALUES(strftime('%s','now','-20 Day') * 1000,'blah',0);INSERT INTO mytable (date,content,important) VALUES(strftime('%s','now','-1 Month') * 1000,'blah',0);SELECT *, datetime(date/1000,'unixepoch') AS fulldate, strftime('%d',date/1000,'unixepoch') AS date_as_DD FROM mytable;结果是:-fulldate列显示完整的日期和时间(不需要)date_as_DD是可用的新列。您可能希望为列名创建一个常量,例如DERIVED_COL_DATEASDD = "date_as_DD";要在整个过程中使用。例如String[] from = new String[] {EventsDbAdapter.COL_DATE, EventsDbAdapter.COL_CONTENT};可以更改为:-String[] from = new String[] {"date_as_DD", EventsDbAdapter.COL_CONTENT};或者,如果使用常量DERIVED_COL_DATEASDD ,则:-String[] from = new String[] {EventsDbAdapter.DERIVED_COL_DATEASDD, EventsDbAdapter.COL_CONTENT};
随时随地看视频慕课网APP

相关分类

Java
我要回答