<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Horatio Caine&#039;s Blog &#187; source</title>
	<atom:link href="http://hxcaine.com/blog/tag/source/feed/" rel="self" type="application/rss+xml" />
	<link>http://hxcaine.com/blog</link>
	<description>A blog of life, ideas and code</description>
	<lastBuildDate>Thu, 19 Jun 2014 00:46:16 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.0.38</generator>
	<item>
		<title>Backing up, importing and restoring databases on Android</title>
		<link>http://hxcaine.com/blog/2010/09/14/backing-up-importing-and-restoring-databases-on-android/</link>
		<comments>http://hxcaine.com/blog/2010/09/14/backing-up-importing-and-restoring-databases-on-android/#comments</comments>
		<pubDate>Tue, 14 Sep 2010 12:43:42 +0000</pubDate>
		<dc:creator><![CDATA[Horatio Caine]]></dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[example]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[import]]></category>
		<category><![CDATA[load]]></category>
		<category><![CDATA[restore]]></category>
		<category><![CDATA[save]]></category>
		<category><![CDATA[source]]></category>
		<category><![CDATA[store]]></category>
		<category><![CDATA[valid]]></category>

		<guid isPermaLink="false">http://hxcaine.wordpress.com/?p=79</guid>
		<description><![CDATA[If your Android application has a database and you want your users to be able to backup the database and restore it as they see fit, you&#8217;ll need to mess about with database files. Below is a class called DbExportImport. Once you&#8217;ve set it up with the correct values, all you need to do is [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>If your Android application has a database and you want your users to be able to backup the database and restore it as they see fit, you&#8217;ll need to mess about with database files.</p>
<p>Below is a class called DbExportImport. Once you&#8217;ve set it up with the correct values, all you need to do is call <strong>exportDb()</strong>, <strong>importDb()</strong> or <strong>restoreDb()</strong> from your application to perform the necessary operations.</p>
<p>This is also useful as a temporary measure when changing your package name or key for application signing, as your application will be newly installed and you will lose your database.</p>
<p>I have only left in a few comments, so for any clarification, leave a comment and I&#8217;ll make it a little clearer.</p>
<p></p><pre class="crayon-plain-tag">package testCode;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Environment;
import android.text.format.DateFormat;
import android.util.Log;

public class DbExportImport {

	public static final String TAG = DbExportImport.class.getName();

	/** Directory that files are to be read from and written to **/
	protected static final File DATABASE_DIRECTORY =
		new File(Environment.getExternalStorageDirectory(),&quot;MyDirectory&quot;);

	/** File path of Db to be imported **/
	protected static final File IMPORT_FILE =
		new File(DATABASE_DIRECTORY,&quot;MyDb.db&quot;);

	public static final String PACKAGE_NAME = &quot;com.example.app&quot;;
	public static final String DATABASE_NAME = &quot;example.db&quot;;
	public static final String DATABASE_TABLE = &quot;entryTable&quot;;

	/** Contains: /data/data/com.example.app/databases/example.db **/
	private static final File DATA_DIRECTORY_DATABASE =
			new File(Environment.getDataDirectory() +
			&quot;/data/&quot; + PACKAGE_NAME +
			&quot;/databases/&quot; + DATABASE_NAME );

	/** Saves the application database to the
	 * export directory under MyDb.db **/
	protected static  boolean exportDb(){
		if( ! SdIsPresent() ) return false;

		File dbFile = DATA_DIRECTORY_DATABASE;
		String filename = &quot;MyDb.db&quot;;

		File exportDir = DATABASE_DIRECTORY;
		File file = new File(exportDir, filename);

		if (!exportDir.exists()) {
			exportDir.mkdirs();
		}

		try {
			file.createNewFile();
			copyFile(dbFile, file);
			return true;
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
	}

	/** Replaces current database with the IMPORT_FILE if
	 * import database is valid and of the correct type **/
	protected static boolean restoreDb(){
		if( ! SdIsPresent() ) return false;

		File exportFile = DATA_DIRECTORY_DATABASE;
		File importFile = IMPORT_FILE;

		if( ! checkDbIsValid(importFile) ) return false;

		if (!importFile.exists()) {
			Log.d(TAG, &quot;File does not exist&quot;);
			return false;
		}

		try {
			exportFile.createNewFile();
			copyFile(importFile, exportFile);
			return true;
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
	}

	/** Imports the file at IMPORT_FILE **/
	protected static boolean importIntoDb(Context ctx){
		if( ! SdIsPresent() ) return false;

		File importFile = IMPORT_FILE;

		if( ! checkDbIsValid(importFile) ) return false;

		try{
			SQLiteDatabase sqlDb = SQLiteDatabase.openDatabase
					(importFile.getPath(), null, SQLiteDatabase.OPEN_READONLY);

			Cursor cursor = sqlDb.query(true, DATABASE_TABLE,
		    		null, null, null, null, null, null, null
		    );

			DbAdapter dbAdapter = new DbAdapter(ctx);
			dbAdapter.open();

			final int titleColumn = cursor.getColumnIndexOrThrow(&quot;title&quot;);
			final int timestampColumn = cursor.getColumnIndexOrThrow(&quot;timestamp&quot;);

			// Adds all items in cursor to current database
			cursor.moveToPosition(-1);
			while(cursor.moveToNext()){
				dbAdapter.createQuote(
						cursor.getString(titleColumn),
						cursor.getString(timestampColumn)
				);
			}

			sqlDb.close();
			cursor.close();
			dbAdapter.close();
		} catch( Exception e ){
			e.printStackTrace();
			return false;
		}

		return true;
	}

	/** Given an SQLite database file, this checks if the file
	 * is a valid SQLite database and that it contains all the
	 * columns represented by DbAdapter.ALL_COLUMN_KEYS **/
	protected static boolean checkDbIsValid( File db ){
		try{
			SQLiteDatabase sqlDb = SQLiteDatabase.openDatabase
				(db.getPath(), null, SQLiteDatabase.OPEN_READONLY);

			Cursor cursor = sqlDb.query(true, DATABASE_TABLE,
            		null, null, null, null, null, null, null
            );

			// ALL_COLUMN_KEYS should be an array of keys of essential columns.
			// Throws exception if any column is missing
			for( String s : DbAdapter.ALL_COLUMN_KEYS ){
				cursor.getColumnIndexOrThrow(s);
			}

			sqlDb.close();
			cursor.close();
		} catch( IllegalArgumentException e ) {
			Log.d(TAG, &quot;Database valid but not the right type&quot;);
			e.printStackTrace();
			return false;
		} catch( SQLiteException e ) {
			Log.d(TAG, &quot;Database file is invalid.&quot;);
			e.printStackTrace();
			return false;
		} catch( Exception e){
			Log.d(TAG, &quot;checkDbIsValid encountered an exception&quot;);
			e.printStackTrace();
			return false;
		}

		return true;
	}

	private static void copyFile(File src, File dst) throws IOException {
		FileChannel inChannel = new FileInputStream(src).getChannel();
		FileChannel outChannel = new FileOutputStream(dst).getChannel();
		try {
			inChannel.transferTo(0, inChannel.size(), outChannel);
		} finally {
			if (inChannel != null)
				inChannel.close();
			if (outChannel != null)
				outChannel.close();
		}
	}

	/** Returns whether an SD card is present and writable **/
	public static boolean SdIsPresent() {
		return Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED);
	}
}</pre><p></p>
]]></content:encoded>
			<wfw:commentRss>http://hxcaine.com/blog/2010/09/14/backing-up-importing-and-restoring-databases-on-android/feed/</wfw:commentRss>
		<slash:comments>37</slash:comments>
		</item>
		<item>
		<title>How to change the refresh rate/interval of AdMob ads on Android</title>
		<link>http://hxcaine.com/blog/2010/09/07/change-admob-ads-refresh-rate/</link>
		<comments>http://hxcaine.com/blog/2010/09/07/change-admob-ads-refresh-rate/#comments</comments>
		<pubDate>Tue, 07 Sep 2010 23:03:15 +0000</pubDate>
		<dc:creator><![CDATA[Horatio Caine]]></dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[ad]]></category>
		<category><![CDATA[admob]]></category>
		<category><![CDATA[ads]]></category>
		<category><![CDATA[advertising]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[change]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[example]]></category>
		<category><![CDATA[refresh interval]]></category>
		<category><![CDATA[refresh rate]]></category>
		<category><![CDATA[sample]]></category>
		<category><![CDATA[source]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://hxcaine.wordpress.com/?p=37</guid>
		<description><![CDATA[Once you&#8217;ve set up AdMob ads for your application, you might want to change how often they are refreshed. If they are refreshed often, your users will see more ads when they&#8217;re on the same screen. This is good in that they see more ads, but can also be very annoying. In the XML entry [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Once you&#8217;ve set up AdMob ads for your application, you might want to change how often they are refreshed.</p>
<p>If they are refreshed often, your users will see more ads when they&#8217;re on the same screen. This is good in that they see more ads, but can also be very annoying.</p>
<p>In the XML entry for your AdMob banner, just add this attribute to set your refresh rate to 60 seconds, as an example:</p>
<p></p><pre class="crayon-plain-tag">app:refreshInterval=&quot;60&quot;</pre><p></p>
<p>AdMob only allows you to have a refresh rate between 12-120 seconds</p>
<p>The complete XML element for the AdMob banner should look something like this:</p>
<p></p><pre class="crayon-plain-tag">&lt;com.admob.android.ads.AdView
	android:id=&quot;@+id/ad&quot;
	android:layout_width=&quot;fill_parent&quot;
	android:layout_height=&quot;wrap_content&quot;
	app:backgroundColor=&quot;#000000&quot;
	app:primaryTextColor=&quot;#FFFFFF&quot;
	app:secondaryTextColor=&quot;#CCCCCC&quot;
	app:keywords=&quot;@string/admob_keywords&quot;
	app:refreshInterval=&quot;60&quot;
	android:layout_gravity=&quot;bottom&quot;
/&gt;</pre><p></p>
]]></content:encoded>
			<wfw:commentRss>http://hxcaine.com/blog/2010/09/07/change-admob-ads-refresh-rate/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
