Android makes SQLite table by reflection

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>

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.