Android makes SQLite table by reflection
Last Update:2015-07-17
Source: Internet
Author: User
<span id="Label3"></p>1. We write a dbhelper inherited from Sqliteopenhelper<pre><span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">class</span></span>DBHelper<span style="color: #0000ff;"><span style="color: #0000ff;">extends</span></span><span style="color: #000000;"><span style="color: #000000;">sqliteopenhelper{</span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">version of the database</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Final</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>Db_version = 1<span style="color: #000000;"><span style="color: #000000;">; </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">Database name</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Final</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span>String db_name = "ladeng.db"<span style="color: #000000;"><span style="color: #000000;">; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span><span style="color: #000000;"><span style="color: #000000;">Context mcontext; </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">we call the constructor of the parent class directly with super, so that we only need to pass in a context parameter when we instantiate the Dbhelper.</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span><span style="color: #000000;"><span style="color: #000000;">dbhelper (context Context) {</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Super</span></span>(context, db_name,<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">, db_version); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> this</span>. Mcontext =<span style="color: #000000;"><span style="color: #000000;">context; } </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">This method is called when the database does not exist.</span></span><span style="color: #000000;"><span style="color: #000000;">@Override</span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">onCreate (sqlitedatabase db) {createtables (db,</span></span>0,0<span style="color: #000000;"><span style="color: #000000;">); } </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">call this method when the version number is changed</span></span><span style="color: #000000;"><span style="color: #000000;">@Override</span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span>Onupgrade (sqlitedatabase db,<span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>oldversion,<span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span><span style="color: #000000;"><span style="color: #000000;">Newversion) { </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">1. Delete the original table</span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">2. Call OnCreate to re-create the database</span></span><span style="color: #000000;"><span style="color: #000000;"> } </span></span><span style="color: #008000;"><span style="color: #008000;">/**</span></span><span style="color: #008000;"><span style="color: #008000;">* Build a table statement, you can build a table in just one row</span></span><span style="color: #008000;"><span style="color: #008000;">*/</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span>Createtables (sqlitedatabase db,<span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>oldversion,<span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span><span style="color: #000000;"><span style="color: #000000;">Newversion) { </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">createtable (movie.class) returns the SQL Build table statement</span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">Db.execsql (sql) executes this build statement</span></span>Db.execsql (createtable (Movie.<span style="color: #0000ff;"><span style="color: #0000ff;">class</span></span><span style="color: #000000;"><span style="color: #000000;">)); } </span></span><span style="color: #008000;"><span style="color: #008000;">/**</span></span><span style="color: #008000;"><span style="color: #008000;">* If not, the default is to use class masterpieces to indicate *</span></span><span style="color: #808080;"><span style="color: #808080;">@param</span></span><span style="color: #008000;"><span style="color: #008000;">Clazz entity class *</span></span><span style="color: #808080;"><span style="color: #808080;">@return</span></span> <span style="color: #008000;"><span style="color: #008000;">*/</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span><T> String createtable (class<t><span style="color: #000000;"><span style="color: #000000;">Clazz) { </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">createtable (clazz, clazz.getsimplename ()); } </span></span><span style="color: #008000;"><span style="color: #008000;">/**</span></span><span style="color: #008000;"><span style="color: #008000;">* The real way to build a table *</span></span><span style="color: #808080;"><span style="color: #808080;">@param</span></span><span style="color: #008000;"><span style="color: #008000;">Clazz entity class *</span></span><span style="color: #808080;"><span style="color: #808080;">@param</span></span><span style="color: #008000;"><span style="color: #008000;">TableName indicates *</span></span><span style="color: #808080;"><span style="color: #808080;">@return</span></span><span style="color: #008000;"><span style="color: #008000;">SQL Build Table statement</span></span><span style="color: #008000;"><span style="color: #008000;">*/</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span><T> String createtable (class<t><span style="color: #000000;"><span style="color: #000000;">clazz, String TableName) { </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">instantiate a container that is used to stitch SQL statements</span></span>StringBuffer Sbuffer =<span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span><span style="color: #000000;"><span style="color: #000000;">StringBuffer (); </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">SQL statement, The first field is _id primary key auto-increment, This is universal, so write directly to the dead</span></span>Sbuffer.append ("create Table if not exists" + tableName + "+" (_id INTEGER PRIMARY KEY AutoIncrement not NULL, "<span style="color: #000000;"><span style="color: #000000;">); </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">get all the public properties in the entity class</span></span>field[] fields =<span style="color: #000000;"><span style="color: #000000;">Clazz.getfields (); </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">Traverse all of the public properties</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;"></span> for</span><span style="color: #000000;"><span style="color: #000000;">(Field Field:fields) {</span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">if the property is not _id, the description is a new field</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(!field.getname (). equals ("_id"<span style="color: #000000;"><span style="color: #000000;">)) { </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">get the basic data type of the property</span></span>String type =<span style="color: #000000;"><span style="color: #000000;">field.gettype (). getsimplename (); </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">if the property is of type string, set the field type to text</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(type.equals ("String"<span style="color: #000000;"><span style="color: #000000;">) {sbuffer.append (field.getname ()</span> )</span>+ "TEXT,"<span style="color: #000000;"><span style="color: #000000;">); </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">If the attribute is of type int, set the field type to integer</span></span>}<span style="color: #0000ff;"><span style="color: #0000ff;">Else</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(type.equals ("int"<span style="color: #000000;"><span style="color: #000000;">) {sbuffer.append (field.getname ()</span> )</span>+ "INTEGER,"<span style="color: #000000;"><span style="color: #000000;">); } } } </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">remove the last comma</span></span>Sbuffer.deletecharat (sbuffer.length ()-1<span style="color: #000000;"><span style="color: #000000;">); </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">replacement); Indicates the end of the SQL statement</span></span>Sbuffer.append (");"<span style="color: #000000;"><span style="color: #000000;">); </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">return this SQL statement</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">sbuffer.tostring (); } }</span></span></pre>2.Movie entity class, the attribute in the entity class is the field in the table<pre><pre><span style="color: #0000ff;"></span> public <span style="color: #0000ff;">class</span> <span style="color: #000000;">Movie { </span>public<span style="color: #0000ff;"></span> <span style="color: #000000;"> String title; </span> <span style="color: #0000ff;"></span> public <span style="color: #0000ff;">int</span> <span style="color: #000000;">rating; </span> <span style="color: #0000ff;"></span> public <span style="color: #000000;">String year; </span> <span style="color: #0000ff;"></span> public <span style="color: #000000;">String genre; </span> <span style="color: #0000ff;"></span> public <span style="color: #000000;">String country; </span> <span style="color: #0000ff;"></span> public <span style="color: #0000ff;">int</span> price <span style="color: #000000;">;}</span></pre></pre>3. Add the following code to the Mainactivity.java<pre><pre> <span style="color: #0000ff;">public </span> <span style="color: #0000ff;">class </span> mainactivity <span style="color: #0000ff;">extends </span> <span style="color: #000000;"> Activity {@Override </span> <span style="color: #0000ff;">protected< /span> <span style="color: #0000ff;">void </span> <span style="color: #000000;"> onCreate (Bundle Savedinstancestate {</span> <span style="color: #0000ff;">super </span> <span style="color: #000000;">.oncreate (savedinstancestate) ; Setcontentview (r.layout.activity_main); </span> <span style="color: #008000;">//</span> <span style="color: #008000;"> Instantiate our dbhelper </span> dbhelper DBHelper = <span style="color: #0000ff;">new </span> dbhelper (<span style="color: #0000ff;">this </span> <span style="color: #000000;">); </span> <span style="color: #008000;">//</span> <span style="color: #008000;"> DBHelper in OnCreate does not execute until this method is called </span> <span style="color: #000000;"> dbhelper.getreadabledatabase (); }}</span></span></pre> </pre>4. We check whether the table has been built in the Data/data/package name/databases/ladeng.db<p><p>Android makes SQLite table by reflection</p></p></span>