"Android" Greendao operation External DB database file

Source: Internet
Author: User
<span id="Label3"></p>1. background<p><p><span style="font-size: large;">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.</span></p></p>2. Project configuration <ul> <ul> <li><span style="font-size: large;">First look at the project Structure:</span></li> </ul> </ul><p><p></p></p><p><p><span style="font-size: large;">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:</span></p></p><p><p><br></p></p> <ul> <ul> <li><span style="font-size: large;">Introduce Greendao library files or reference library Projects:</span></li> </ul> </ul><p><p></p></p>2. Code Implementation<p><p><span style="font-size: large;">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;</span></p></p> <ul> <ul> <ul> <li><span style="font-size: large;">We need to get the path to the application DB store, by the following way:</span></li> </ul> </ul> </ul><p><p></p></p><pre><pre><span style="color: #0000ff;">Private</span> <span style="color: #0000ff;">void</span> <span style="color: #000000;">Getappinfo () { </span><span style="color: #008000;">//</span> <span style="color: #008000;"> Get an instance</span> of Packagemanager Packagemanager Packagemanager =<span style="color: #000000;"> Getpackagemanager (); </span> <span style="color: #008000;">//</span> <span style="color: #008000;">Getpackagename () is the package name of your current class, and 0 means to get version information</span> <span style="color: #0000ff;">Try</span> <span style="color: #000000;"> { </span><span style="color: #800080;">0</span><span style="color: #000000;">); } </span> <span style="color: #0000ff;">Catch</span> <span style="color: #000000;">(namenotfoundexception E) { e.printstacktrace (); } }</span></pre></pre><p><p></p></p> <ul> <ul> <ul> <li><p><span style="font-size: large;">The path to the database can be obtained in the above way:<br></span></p></li> <li><p><span style="font-size: large;">Copy operation:</span></p></li> </ul> </ul> </ul><p><p></p></p><pre><span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span>Boolean copyrawdbtoapkdb (context context,<span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span><span style="color: #000000;"><span style="color: #000000;">copyrawdbresid, string apkdbpath, string Dbname,boolean refresh) throws IOException {boolean b </span></span>=<span style="color: #0000ff;"><span style="color: #0000ff;">false</span></span><span style="color: #000000;"><span style="color: #000000;">; File F</span></span>=<span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span><span style="color: #000000;"><span style="color: #000000;">File (apkdbpath); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(!<span style="color: #000000;"><span style="color: #000000;">f.exists ()) {f.mkdirs (); } File DBFile</span></span>=<span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span>File (apkdbpath +<span style="color: #000000;"><span style="color: #000000;">dbName); b</span></span>=<span style="color: #000000;"><span style="color: #000000;">isdbfileexists (dbfile,refresh); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(!<span style="color: #000000;"><span style="color: #000000;">B) {inputstream</span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> is</span>=<span style="color: #000000;"><span style="color: #000000;">context.getresources (). Openrawresource (copyrawdbresid); Zipinputstream ZiS</span></span>=<span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span>Zipinputstream (<span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span>Bufferedinputstream (<span style="color: #0000ff;"><span style="color: #0000ff;"></span> is</span><span style="color: #000000;"><span style="color: #000000;">)); ZipEntry entry; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> while</span>((entry = Zis.getnextentry ())! =<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">) { </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span><span style="color: #000000;"><span style="color: #000000;">size; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">byte</span></span>[] buffer =<span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">byte</span></span>[<span style="color: #800080;"><span style="color: #800080;">1024x768</span></span>*<span style="color: #800080;"><span style="color: #800080;">2</span></span><span style="color: #000000;"><span style="color: #000000;">]; OutputStream Fos</span></span>=<span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span>FileOutputStream (apkdbpath +<span style="color: #000000;"><span style="color: #000000;">Entry.getname ()); Bufferedoutputstream Bos</span></span>=<span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span><span style="color: #000000;"><span style="color: #000000;">Bufferedoutputstream (fos, buffer.length); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> while</span>(size = Zis.read (buffer,<span style="color: #800080;"><span style="color: #800080;">0</span></span>, buffer.length))! =-<span style="color: #800080;"><span style="color: #800080;">1</span></span><span style="color: #000000;"><span style="color: #000000;">) {bos.write (buffer,</span></span><span style="color: #800080;"><span style="color: #800080;">0</span></span><span style="color: #000000;"><span style="color: #000000;">, size); } Bos.flush (); Bos.close (); } zis.close (); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> is</span><span style="color: #000000;"><span style="color: #000000;">. Close (); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span>!<span style="color: #000000;"><span style="color: #000000;">b; }</span></span></pre><p><p><span style="color: #474584; font-size: large;">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;</span></p></p> <ul> <ul> <li><span style="font-size: large;">Using the Greendao Java project, generate the entity classes for the table corresponding to the external DB file DAO class Code:</span></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><span style="color: #008000;"><span style="color: #008000;">/*</span></span><span style="color: #008000;"><span style="color: #008000;">* * External database control class</span></span><span style="color: #008000;"><span style="color: #008000;">*/</span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">class</span></span><span style="color: #000000;"><span style="color: #000000;">dbcontroller{</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span><span style="color: #000000;"><span style="color: #000000;">Daomaster daomasterecmc; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span><span style="color: #000000;"><span style="color: #000000;">Daomaster daomasterschool; </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">Default DB</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span><span style="color: #000000;"><span style="color: #000000;">daosession daosessiondefault; </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">db of the copy</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span><span style="color: #000000;"><span style="color: #000000;">daosession daoschoolsession; </span></span><span style="color: #008000;"><span style="color: #008000;">/*</span></span><span style="color: #008000;"><span style="color: #008000;">* * Default database name: Localdata</span></span><span style="color: #008000;"><span style="color: #008000;">*/</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span>Final String database_name =<span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #800000;"><span style="color: #800000;">localdata.db</span></span><span style="color: #800000;"><span style="color: #800000;">"</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;">* * Copy Database Name: school</span></span><span style="color: #008000;"><span style="color: #008000;">*/</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span>Final String Database_school_name =<span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #800000;"><span style="color: #800000;">school.db</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span><span style="color: #000000;"><span style="color: #000000;">daomaster obtainmaster (context context, String DbName) {</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span>Daomaster (<span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span>Daomaster.devopenhelper (context, dbName,<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">). getwritabledatabase ()); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span><span style="color: #000000;"><span style="color: #000000;">daomaster getdaomaster (context context, String DbName) {</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(dbName = =<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">) </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(DAOMASTERECMC = =<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">) {DAOMASTERECMC</span></span>=<span style="color: #000000;"><span style="color: #000000;">Obtainmaster (context, dbName); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">daomasterecmc; } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span><span style="color: #000000;"><span style="color: #000000;">daomaster getschooldaomaster (context context, String DbName) {</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(dbName = =<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">) </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">; </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(daomasterschool = =<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">) {daomasterschool</span></span>=<span style="color: #000000;"><span style="color: #000000;">Obtainmaster (context, dbName); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">daomasterschool; } </span></span><span style="color: #008000;"><span style="color: #008000;">/*</span></span><span style="color: #008000;">* * <span style="color: #008000;">Get daosession * * @return</span></span><span style="color: #008000;"><span style="color: #008000;">*/</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span><span style="color: #000000;"><span style="color: #000000;">daosession getdaosession (String DbName) {</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(daoschoolsession = =<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">) {daoschoolsession</span></span>=<span style="color: #000000;"><span style="color: #000000;">getschooldaomaster (mainapplication.getins (), dbName). newsession (); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">daoschoolsession; } </span></span><span style="color: #008000;"><span style="color: #008000;">/*</span></span><span style="color: #008000;"><span style="color: #008000;">* * Default operation Localdata Database</span></span><span style="color: #008000;"><span style="color: #008000;">*/</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">Static</span></span><span style="color: #000000;"><span style="color: #000000;">daosession getdaosession () {</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(daosessiondefault = =<span style="color: #0000ff;"><span style="color: #0000ff;">NULL</span></span><span style="color: #000000;"><span style="color: #000000;">) {daosessiondefault</span></span>=<span style="color: #000000;"><span style="color: #000000;">getdaomaster (mainapplication.getins (), database_name). newsession (); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span><span style="color: #000000;"><span style="color: #000000;">daosessiondefault; }}</span></span></pre> <ul> <ul> <li><span style="font-size: large;">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:</span></li> </ul> </ul><p><p></p></p><pre><span style="color: #0000ff;"><span style="color: #0000ff;"></span> public</span> <span style="color: #0000ff;"><span style="color: #0000ff;">class</span></span><span style="color: #000000;"><span style="color: #000000;">Mainactivity extends activity{</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span><span style="color: #000000;"><span style="color: #000000;">StringBuilder builder; @Override</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">protected</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">onCreate (Bundle Savedinstancestate) {super.oncreate (savedinstancestate); Setcontentview (r.layout.activity_main); </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">Create default data and insert a piece of data</span></span>Historydao Historydao =<span style="color: #000000;"><span style="color: #000000;">dblocalcontroller.getdaosession (). Gethistorydao (); History entity</span></span>=<span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span><span style="color: #000000;">history <span style="color: #000000;">(); Entity.setname (</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #800000;"><span style="color: #800000;">Colorado</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">); Entity.setimageurl (</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #800000;"><span style="color: #800000;">http://www.baidu.com</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">); Historydao.insert (entity); </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">copy the external db file to the specified directory</span></span><span style="color: #000000;"><span style="color: #000000;">copyrawdb (); </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">querying external DB file data via Greendao</span></span><span style="color: #000000;"><span style="color: #000000;">Seldbdata (); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">seldbdata () {studentdao student</span></span>=<span style="color: #000000;"><span style="color: #000000;">dbcontroller.getdaosession (dbcontroller.database_school_name). Getstudentdao (); List</span></span><Student> students =<span style="color: #000000;"><span style="color: #000000;">student.querybuilder (). List (); Builder</span></span>=<span style="color: #0000ff;"><span style="color: #0000ff;">New</span></span><span style="color: #000000;"><span style="color: #000000;">StringBuilder (); </span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> for</span>(<span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>i =<span style="color: #800080;"><span style="color: #800080;">0</span></span>; I < students.size (); i++<span style="color: #000000;"><span style="color: #000000;">) {builder.append (students.</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Get</span></span>(i). GetName () +<span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #800000;"><span style="color: #800000;">---</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">); } toast.maketext (mainactivity.</span></span><span style="color: #0000ff;"><span style="color: #0000ff;"></span> this</span><span style="color: #000000;"><span style="color: #000000;">, builder.tostring (), toast.length_short). show (); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Private</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">copyrawdb () {</span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Try</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;">copy Res/raw/xxxxdb.zip to</span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">under The/data/data/com.xinhang.mobileclient/databases/directory</span></span>Boolean issuccess = Dbutils.copyrawdbtoapkdb (mainactivity.<span style="color: #0000ff;"><span style="color: #0000ff;"></span> this</span>, r.raw.schooldb, dbutils.apk_db_path, dbutils.ecmc_db_name,<span style="color: #0000ff;"><span style="color: #0000ff;">false</span></span><span style="color: #000000;"><span style="color: #000000;">); } </span></span><span style="color: #0000ff;"><span style="color: #0000ff;">Catch</span></span><span style="color: #000000;"><span style="color: #000000;">(ioexception E) {e.printstacktrace (); } }}</span></span></pre><p><p></p></p><p><p><span style="font-size: large;">Operation Result:</span></p></p><p><p></p></p><p><p><span style="font-size: large;">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;</span></p></p><p><p></p></p>

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.