If using the default system management, the default is placed under the package, more worry, and after uninstalling the app will not cause data residue, but this also has a problem, such as I do a back word software, then when the user uninstalled the app, he worked hard to download the word library also lost ...
So I think of the solution is to change the database path, not put under the package, put on the SD card. Look carefully, it is not easy to do, online someone even to change the source code. Finally, however, we found a solution:
Look at the Sqliteopenhelper source code, you will find that there is such a piece:
if (Mname = = null) { db = Sqlitedatabase.create (null); } else { db = mcontext.openorcreatedatabase (mname, 0, M Factory); }
You can see that when mname is not empty, it is created and opened by Mcontext. And this mcontext can be passed through the constructor function.
Look at the Sqlliteopenhelper this implementation class:
Package Cn.com.xx.xx.util;import Android.content.context;import Android.database.sqlite.sqlitedatabase;import android.database.sqlite.sqliteopenhelper;/** * Database Helper class * @author Howlaa * @date 2015-1-5 14:38:28 */pub Lic class Dbopenhelper extends Sqliteopenhelper {private static final String DBNAME = "test.db"; private static final int VERSION = 11;public Dbopenhelper (context context) {Super (context, DBNAME, NULL, VERSION);//it ' s Location is data/data/pakage/database} @Overridepublic void OnCreate (Sqlitedatabase db) {//it'll be called when the Datab ASE is created first db.execsql ("CREATE TABLE IF not EXISTS exam_type (ID integer primary key autoincrement, Type_nam e varchar (+), type_id INTEGER) "); } @Override //It ' ll be called when the database is updatedpublic void Onupgrade (sqlitedatabase db, int oldversion, in T newversion) {}}
The rest is going to be done with this mcontext:
Package Cn.com.smartcost.scexam.util;import Java.io.file;import Java.io.ioexception;import android.content.Context ; Import Android.content.contextwrapper;import Android.database.databaseerrorhandler;import Android.database.sqlite.sqlitedatabase;import Android.database.sqlite.sqlitedatabase.cursorfactory;import android.util.log;/** * is used to support access to the database stored on the SD card **/public class Databasecontext extends Contextwrapper { /** * Constructor * @param base context */public databasecontext (context base) {Su Per (base); /** * Gets the database path, if it does not exist, creates the object object * @param name * @param mode * @param FA Ctory */@Override public File Getdatabasepath (String name) {//To determine if there is an SD card bool Ean sdexist = android.os.Environment.MEDIA_MOUNTED.equals (Android.os.Environment.getExternalStorageState ()); if (!sdexist) {//If not present, LOG.E ("SD card management:", "SD card does not exist, please addSD card "); return null; } else{//if present//Get SD card path String Dbdir=android.os.environment.getexternalstoragedi Rectory (). toString (); Dbdir + = "/scexam";//the directory where the database is located String dbPath = dbdir+ "/" +name;//database path//Determine if the directory exists and does not exist then create the directory File Dirfile = new file (Dbdir); if (!dirfile.exists ()) dirfile.mkdirs (); Whether the database file was created successfully boolean isfilecreatesuccess = false; Determines whether the file exists, does not exist, and creates the file DBFile = new files (dbPath); if (!dbfile.exists ()) {try {isfilecreatesuccess = Dbfile.cre Atenewfile ();//Create File} catch (IOException e) {//TODO auto-generated catch block E.printstacktrace (); }} else Isfilecreatesuccess = true; Returns the database file object if (isfilecreatesuccess) return dbfile; else return null; }}/** * Overloads this method, which is used to open the database on the SD card, Android 2.3 and the following will call this method. * * @param name * @param mode * @param factory */@Override Public Sqlitedatabase openorcreatedatabase (String name, int mode, Sqlitedatabase.cursorfactory Factory) { Sqlitedatabase result = Sqlitedatabase.openorcreatedatabase (Getdatabasepath (name), NULL); return result; /** * Android 4.0 calls this method to get the database. * * @see android.content.contextwrapper#openorcreatedatabase (java.lang.String, int, * Andro Id.database.sqlite.SQLiteDatabase.CursorFactory, * android.database.DatabaseErrorHandler) * @ param NAME * @param mode * @param factory * @param errorhandler */@Override Public sqlitedatabase openorcreatedatabase (String name, int mode, Cursorfactory factory, Databaseerrorh Andler ErrorHandler) {sqlitedatabase result = Sqlitedatabase.openorcreatedatabase (Getdatabasepath (name), NULL) ; return result; } }
Use:
Databasecontext dbContext = new Databasecontext (this); Sdcarddbhelper dbhelper = new Sdcarddbhelper (dbContext);
Finally, do not forget, plus read and write the SD card permissions:
<uses-permission android:name= "Android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
Android uses Sqlliteopenhelper to change the storage path of the database onto the SD card