Introducing Android migrations

1 2 3 Page 2
Page 2 of 3
migrations.xml contains database version, package name and database name
<span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<code class='xml'><span class='line'><span class="cp"><?xml version="1.0" encoding="utf-8"?></span>
</span><span class='line'><span class="nt"><resources></span>
</span><span class='line'>    <span class="nt"><integer</span> <span class="na">name=</span><span class="s">"database_version"</span><span class="nt">></span>1<span class="nt"></integer></span>
</span><span class='line'>    <span class="nt"><string</span> <span class="na">name=</span><span class="s">"database_name"</span><span class="nt">></span>a_catalog<span class="nt"></string></span>
</span><span class='line'>    <span class="nt"><string</span> <span class="na">name=</span><span class="s">"package_name"</span><span class="nt">></span>com.b50.db.ex<span class="nt"></string></span>
</span><span class='line'><span class="nt"></resources></span>
</span></code>

Note the value of database_version – it’s 1. This corresponds to the DBVersion1 class that was generated. Take a look at that class:

DBVersion1 is your initial migration class
<span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<code class='java'><span class='line'><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">b50</span><span class="o">.</span><span class="na">db</span><span class="o">.</span><span class="na">ex</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">com.b50.migrations.AbstractMigration</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">DBVersion1</span> <span class="kd">extends</span> <span class="n">AbstractMigration</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">up</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="c1">//execSQL("some sql create stmts");</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">down</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="c1">//execSQL("some delete sql stmts");</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code>

This class is where you implement your initial migration, which would create various tables and populate them. Use the execSQL method to pass in a valid SQL String. For example, I’ll create an initial migration like so:

DBVersion1 is now implemented
<span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<code class='java'><span class='line'><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">b50</span><span class="o">.</span><span class="na">db</span><span class="o">.</span><span class="na">ex</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">com.b50.migrations.AbstractMigration</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">DBVersion1</span> <span class="kd">extends</span> <span class="n">AbstractMigration</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">up</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">String</span> <span class="n">create</span> <span class="o">=</span> <span class="s">"CREATE TABLE hops (_id integer  PRIMARY KEY AUTOINCREMENT DEFAULT NULL, name TEXT, description TEXT, substitutions TEXT DEFAULT '', alpha_acid TEXT DEFAULT '', beer_styles TEXT DEFAULT '', type TEXT DEFAULT '', user_notes TEXT DEFAULT '');"</span><span class="o">;</span>
</span><span class='line'>      <span class="n">execSQL</span><span class="o">(</span><span class="n">create</span><span class="o">);</span>
</span><span class='line'>      <span class="n">String</span> <span class="n">oneThing</span> <span class="o">=</span> <span class="s">"INSERT INTO 'hops' VALUES(1,'Amarillo','Spicy hop with mild bitterness and a noble aroma.  Good all around hop.','Cascade, Centennial','7 to 10','Ale, IPA','Aroma', '');"</span><span class="o">;</span>
</span><span class='line'>      <span class="n">execSQL</span><span class="o">(</span><span class="n">oneThing</span><span class="o">);</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">down</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">execSQL</span><span class="o">(</span><span class="s">"DROP TABLE hops;"</span><span class="o">);</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="o">}</span>
</span></code>

As you can see, my up method creates a table and inserts one record. My down method rolls things back, which in this case means dropping the created table.

Now all I have to do is make use of my app’s DatabaseHelper instance and Droid Migrate will ensure things are properly initialized. Therefore, I’ll update the original Activity to display a list of what’s in the database, which I know only to be one record based upon my initial migration.

Related:
1 2 3 Page 2
Page 2 of 3
InfoWorld Technology of the Year Awards 2023. Now open for entries!