DateLens.java

package net.zer0bandwidth.android.lib.database.sqlitehouse.refractor;

import android.content.ContentValues;
import android.database.Cursor;
import android.os.Bundle;

import net.zer0bandwidth.android.lib.database.SQLiteSyntax;

import java.util.Date;

import static net.zer0bandwidth.android.lib.database.SQLiteSyntax.SQLITE_NULL;

/**
 * Marshals {@link java.util.Date} objects.
 *
 * <p>The lens converts all dates into integer GMT timestamps for storage in the
 * DB, then recreates the {@code Date} objects upon retrieval. This is because
 * integer timestamps are more reliably stored and are absolute (no fretting
 * about timezones).</p>
 *
 * @see SQLDateLens
 * @since zer0bandwidth-net/android 0.1.4 (#26)
 */
public class DateLens
extends Lens<Date>
implements Refractor<Date>
{
	@Override
	public String getSQLiteDataType()
	{ return SQLiteSyntax.SQLITE_TYPE_INT ; }

	/**
	 * When a date cannot be null, this class provides a default value at the
	 * start of the epoch.
	 * @return a {@code Date} initialized at epoch time zero
	 */
	@Override
	public Date getSQLiteDefaultValue()
	{ return new Date(0) ; }

	@Override
	public String toSQLiteString( Date o )
	{
		return ( o == null ? SQLITE_NULL :
			Long.toString( o.getTime() ) ) ;
	}

	@Override
	public DateLens addToContentValues( ContentValues vals, String sKey, Date val )
	{
		vals.put( sKey, val.getTime() ) ;
		return this ;
	}

	/** @since zer0bandwidth-net/android 0.1.7 (#50) */
	@Override
	public DateLens addToBundle( Bundle bndl, String sKey, Date val )
	{
		bndl.putLong( sKey, val.getTime() ) ;
		return this ;
	}

	@Override
	public Date fromCursor( Cursor crs, String sKey )
	{
		long ts = crs.getLong( crs.getColumnIndex( sKey ) ) ;
		return new Date( ts ) ;
	}

	/** @since zer0bandwidth-net/android 0.1.7 (#50) */
	@Override
	public Date fromBundle( Bundle bndl, String sKey )
	{ return new Date( bndl.getLong( sKey ) ) ; }
}