"Android" Greendao operation External DB database file

Source: Internet
Author: User
<span id="Label3"></p>1. background<p><p>The so-called external database file here refers to a separately created in the external DB file, if there is a scenario, we have some local data in the project, do not need the interface to obtain (do not need to do network operations), write dead data, such as the provinces of the Country's various cities of the basic information, The information of each city can be stored as a record in the table, used in the project, how we have a db file containing this information, we can operate the db file through the greendao, more convenient for development work, of course, This is just a simulation situation, as for the unreasonable, There is no better way, but much discussion here, focusing on such a way, this way can be used for some infrequently changing Data.</p></p>2. Project configuration <ul> <ul> <li>First look at the project Structure:</li> </ul> </ul><p><p></p></p><p><p>Res/raw directory is stored in the external DB file compressed file, we can open to look at the database structure, the DB file contains two tables, student and teacher inside the simple insert a few test data:</p></p><p><p><br></p></p> <ul> <ul> <li>Introduce Greendao library files or reference library Projects:</li> </ul> </ul><p><p></p></p>2. Code Implementation<p><p>Before the implementation of the specific idea, the program run, The Raw directory is the first copy of the DB file to the database storage default directory, and then through the Greendao API to operate the file;</p></p> <ul> <ul> <li>We need to get the path to the application DB store, by the following way:</li> </ul> </ul><pre class="prettyprint"><pre class="prettyprint"><code class=" hljs cs"><span class="hljs-keyword">private</span><span class="hljs-keyword">void</span><span class="hljs-title">getAppInfo</span>() { <span class="hljs-comment">// 获取packageManager的实例</span> PackageManager packageManager = getPackageManager(); <span class="hljs-comment">// getPackageName()是你当前类的包名,0代表是获取版本信息</span> <span class="hljs-keyword">try</span> { <span class="hljs-number">0</span>); } <span class="hljs-keyword">catch</span> (NameNotFoundException e) { e.printStackTrace(); } }</code></pre></pre> <ul> <ul> <li><p>The path to the database can be obtained in the above way:<br></p></li> <li><p>Copy operation:</p></li> </ul> </ul><pre class="prettyprint"><code class=" hljs java"><span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Boolean</span></span> <span class="hljs-title"><span class="hljs-title">COPYRAWDBTOAPKDB</span></span>(context context,<span class="hljs-keyword"><span class="hljs-keyword">int</span></span>copyrawdbresid, string apkdbpath, string dbName,<span class="hljs-keyword"><span class="hljs-keyword">Boolean</span></span>Refresh<span class="hljs-keyword"><span class="hljs-keyword">throws</span></span>IOException {<span class="hljs-keyword"><span class="hljs-keyword">Boolean</span></span>b =<span class="hljs-keyword"><span class="hljs-keyword">false</span></span>; File f =<span class="hljs-keyword"><span class="hljs-keyword">New</span></span>File (apkdbpath);<span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(!f.exists ()) {f.mkdirs (); } File DBFile =<span class="hljs-keyword"><span class="hljs-keyword">New</span></span>File (apkdbpath + dbName); b = Isdbfileexists (dbfile,refresh);<span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(!b) {inputstream is = context.getresources (). openrawresource (copyrawdbresid); Zipinputstream ZiS =<span class="hljs-keyword"><span class="hljs-keyword">New</span></span>Zipinputstream (<span class="hljs-keyword"><span class="hljs-keyword">New</span></span>Bufferedinputstream (is)); ZipEntry entry;<span class="hljs-keyword"><span class="hljs-keyword"></span> while</span>((entry = Zis.getnextentry ())! =<span class="hljs-keyword"><span class="hljs-keyword">NULL</span></span>) {<span class="hljs-keyword"><span class="hljs-keyword">int</span></span>Size<span class="hljs-keyword"><span class="hljs-keyword">byte</span></span>[] buffer =<span class="hljs-keyword"><span class="hljs-keyword">New</span></span> <span class="hljs-keyword"><span class="hljs-keyword">byte</span></span>[<span class="hljs-number"><span class="hljs-number">1024x768</span></span>*<span class="hljs-number"><span class="hljs-number">2</span></span>]; OutputStream fos =<span class="hljs-keyword"><span class="hljs-keyword">New</span></span>FileOutputStream (apkdbpath + entry.getname ()); Bufferedoutputstream BOS =<span class="hljs-keyword"><span class="hljs-keyword">New</span></span>Bufferedoutputstream (fos, buffer.length);<span class="hljs-keyword"><span class="hljs-keyword"></span> while</span>(size = Zis.read (buffer,<span class="hljs-number"><span class="hljs-number">0</span></span>, buffer.length))! =-<span class="hljs-number"><span class="hljs-number">1</span></span>) {bos.write (buffer,<span class="hljs-number"><span class="hljs-number">0</span></span>, size); } Bos.flush (); Bos.close (); } zis.close (); Is.close (); }<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>!b; }</code></pre><p><p>Here is the copy operation of the key code, we need to pass in the raw resource id, the database copy path, database file name, whether to overwrite the existing DB file, @return copy is successful, about the refresh parameter, we generally want to copy only once, When we update the DB file in some cases, it can be set to True to overwrite the operation;</p></p> <ul> <ul> <li>Using the Greendao Java project, generate the entity classes for the table corresponding to the external DB file DAO class Code:</li> </ul> </ul><p><p></p></p><p><p>In the Dbcontroller class is my encapsulated database operation class, more convenient for us to operate, Dbcontroller's key code is as Follows:</p></p><pre class="prettyprint"><code class=" hljs java"><span class="hljs-javadoc"><span class="hljs-javadoc">/** * External Database control class *</span> /</span><span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-class"><span class="hljs-class"> <span class="hljs-keyword">class</span> <span class="hljs-title">dbcontroller</span>{</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Private</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span>Daomaster daomasterecmc;<span class="hljs-keyword"><span class="hljs-keyword">Private</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span>Daomaster daomasterschool;<span class="hljs-comment"><span class="hljs-comment">//default DB</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Private</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span>Daosession daosessiondefault;<span class="hljs-comment"><span class="hljs-comment">//copy of DB</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Private</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span>Daosession daoschoolsession;<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Default database name: localdata */</span></span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Final</span></span>String database_name =<span class="hljs-string"><span class="hljs-string">"localdata.db"</span></span>;<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Copy Database name: school */</span></span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Final</span></span>String Database_school_name =<span class="hljs-string"><span class="hljs-string">"school.db"</span></span>;<span class="hljs-keyword"><span class="hljs-keyword">Private</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span>Daomaster<span class="hljs-title"><span class="hljs-title">Obtainmaster</span></span>(context context, String DbName) {<span class="hljs-keyword"><span class="hljs-keyword">return</span></span> <span class="hljs-keyword"><span class="hljs-keyword">New</span></span>Daomaster (<span class="hljs-keyword"><span class="hljs-keyword">New</span></span>Daomaster.devopenhelper (context, dbName,<span class="hljs-keyword"><span class="hljs-keyword">NULL</span></span>). getwritabledatabase ()); }<span class="hljs-keyword"><span class="hljs-keyword">Private</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span>Daomaster<span class="hljs-title"><span class="hljs-title">Getdaomaster</span></span>(context context, String DbName) {<span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(dbName = =<span class="hljs-keyword"><span class="hljs-keyword">NULL</span></span>)<span class="hljs-keyword"><span class="hljs-keyword">return</span></span> <span class="hljs-keyword"><span class="hljs-keyword">NULL</span></span>;<span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(DAOMASTERECMC = =<span class="hljs-keyword"><span class="hljs-keyword">NULL</span></span>) {DAOMASTERECMC = Obtainmaster (context, dbName); }<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>daomasterecmc; }<span class="hljs-keyword"><span class="hljs-keyword">Private</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span>Daomaster<span class="hljs-title"><span class="hljs-title">Getschooldaomaster</span></span>(context context, String DbName) {<span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(dbName = =<span class="hljs-keyword"><span class="hljs-keyword">NULL</span></span>)<span class="hljs-keyword"><span class="hljs-keyword">return</span></span> <span class="hljs-keyword"><span class="hljs-keyword">NULL</span></span>;<span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(daomasterschool = =<span class="hljs-keyword"><span class="hljs-keyword">NULL</span></span>) {daomasterschool = Obtainmaster (context, dbName); }<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>daomasterschool; }<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Get daosession * *<span class="hljs-javadoctag"> @return</span> </span> * *</span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span>Daosession<span class="hljs-title"><span class="hljs-title">getdaosession</span></span>(String DbName) {<span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(daoschoolsession = =<span class="hljs-keyword"><span class="hljs-keyword">NULL</span></span>{daoschoolsession = Getschooldaomaster (mainapplication.getins (), dbName). newsession (); }<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>daoschoolsession; }<span class="hljs-javadoc"><span class="hljs-javadoc">/** * Default Operation localdata Database *</span> /</span> <span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-keyword"><span class="hljs-keyword">Static</span></span>Daosession<span class="hljs-title"><span class="hljs-title">getdaosession</span></span>() {<span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(daosessiondefault = =<span class="hljs-keyword"><span class="hljs-keyword">NULL</span></span>{daosessiondefault = Getdaomaster (mainapplication.getins (), database_name). newsession (); }<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>daosessiondefault; }}</code></pre> <ul> <ul> <li>Perhaps we also need the default Greendao database for other operations, as the default operation is no longer described in detail here, do not understand the Greendao basic use, here we demonstrate the external db file named school.db, The default Greendao database is named history.db, and we test the operation in Mainactivity Below:</li> </ul> </ul><pre class="prettyprint"><code class=" hljs java"><span class="hljs-keyword"><span class="hljs-keyword"></span> public</span> <span class="hljs-class"><span class="hljs-class"> <span class="hljs-keyword">class</span> <span class="hljs-title">mainactivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span>{</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Private</span></span>StringBuilder builder;<span class="hljs-annotation"><span class="hljs-annotation">@Override</span></span> <span class="hljs-keyword"><span class="hljs-keyword">protected</span></span> <span class="hljs-keyword"><span class="hljs-keyword">void</span></span> <span class="hljs-title"><span class="hljs-title">onCreate</span></span>(Bundle Savedinstancestate) {<span class="hljs-keyword"><span class="hljs-keyword">Super</span></span>. onCreate (savedinstancestate); Setcontentview (r.layout.activity_main);<span class="hljs-comment"><span class="hljs-comment">//create default data and insert a piece of data</span></span>Historydao Historydao = dblocalcontroller.getdaosession (). Gethistorydao (); History entity =<span class="hljs-keyword"><span class="hljs-keyword">New</span></span>History (); Entity.setname (<span class="hljs-string"><span class="hljs-string">"colorado"</span></span>); Entity.setimageurl (<span class="hljs-string"><span class="hljs-string">"http://www.baidu.com"</span></span>); Historydao.insert (entity);<span class="hljs-comment"><span class="hljs-comment">//copy The external db file to the specified directory</span></span>Copyrawdb ();<span class="hljs-comment"><span class="hljs-comment">//querying External db file data via Greendao</span></span>Seldbdata (); }<span class="hljs-keyword"><span class="hljs-keyword">Private</span></span> <span class="hljs-keyword"><span class="hljs-keyword">void</span></span> <span class="hljs-title"><span class="hljs-title">Seldbdata</span></span>() {studentdao student = dbcontroller.getdaosession (dbcontroller.database_school_name). Getstudentdao (); list<student> students = Student.querybuilder (). list (); Builder =<span class="hljs-keyword"><span class="hljs-keyword">New</span></span>StringBuilder ();<span class="hljs-keyword"><span class="hljs-keyword"></span> for</span>(<span class="hljs-keyword"><span class="hljs-keyword">int</span></span>i =<span class="hljs-number"><span class="hljs-number">0</span></span>; I < students.size (); I++) {builder.append (students.get (i). getName () +<span class="hljs-string"><span class="hljs-string">"---"</span></span>); } Toast.maketext (mainactivity.<span class="hljs-keyword"><span class="hljs-keyword"></span> this</span>, builder.tostring (), toast.length_short). show (); }<span class="hljs-keyword"><span class="hljs-keyword">Private</span></span> <span class="hljs-keyword"><span class="hljs-keyword">void</span></span> <span class="hljs-title"><span class="hljs-title">copyrawdb</span></span>() {<span class="hljs-keyword"><span class="hljs-keyword">Try</span></span>{<span class="hljs-comment"><span class="hljs-comment">//copy Res/raw/xxxxdb.zip to</span></span> <span class="hljs-comment"><span class="hljs-comment">///data/data/com.xinhang.mobileclient/databases/directory below</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Boolean</span></span>issuccess = Dbutils.copyrawdbtoapkdb (mainactivity.<span class="hljs-keyword"><span class="hljs-keyword"></span> this</span>, r.raw.schooldb, dbutils.apk_db_path, dbutils.ecmc_db_name,<span class="hljs-keyword"><span class="hljs-keyword">false</span></span>); }<span class="hljs-keyword"><span class="hljs-keyword">Catch</span></span>(ioexception E) {e.printstacktrace (); } }}</code></pre><p><p>Operation Result:</p></p><p><p></p></p><p><p>You can see that our external db files have been copied to the default path of the database, and our default database has been created successfully, and the way to differentiate two databases is through the dblocalcontroller.getdaosession (name) method, To manipulate which database to pass in the corresponding database name, GIF operation diagram is as follows;</p></p><p><p></p></p><p><p>Source code download: Source download, have questions Welcome to Exchange discussion!</p></p> <p><p>"Android" Greendao operation External DB database file</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.