我们知道数据库创建的时候默认保存到系统data/data/项目名 下面了,有没有一种方法保存到自己指定的SDCard上的文件夹里面呢?答案是可以的。我们只需要找到SQLiteOpenHelper这个类,了解一下 就不难发现其保存的路径是固定了的,那么我们只需要改动一下getWritableDatabase(),即写入的时候的路径:
01 | public synchronized SQLiteDatabase getWritableDatabase() { |
02 | if (mDatabase != null && mDatabase.isOpen() && !mDatabase.isReadOnly()) { |
06 | if (mIsInitializing) { |
07 | throw new IllegalStateException( "getWritableDatabase called recursively" ); |
16 | boolean success = false ; |
17 | SQLiteDatabase db = null ; |
18 | if (mDatabase != null ) mDatabase.lock(); |
20 | mIsInitializing = true ; |
22 | db = SQLiteDatabase.create( null ); |
24 | <span style= "color: red;" > db = mContext.openOrCreateDatabase(mName, 0 , mFactory);</span> |
27 | int version = db.getVersion(); |
28 | if (version != mNewVersion) { |
29 | db.beginTransaction(); |
34 | onUpgrade(db, version, mNewVersion); |
36 | db.setVersion(mNewVersion); |
37 | db.setTransactionSuccessful(); |
47 | mIsInitializing = false ; |
49 | if (mDatabase != null ) { |
50 | try { mDatabase.close(); } catch (Exception e) { } |
55 | if (mDatabase != null ) mDatabase.unlock(); |
56 | if (db != null ) db.close(); |
注意标志的红色的部分,这是创建数据库的地方,我们再看看openOrCreateDatabase()
这个方法,openOrCreateDatabase() 这个方法存在于package android.content;下面的public abstract class Context{}类里面,
1 | public abstract SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory); |
我们发现在package android.database.sqlite;包下的public class SQLiteDatabase extends SQLiteClosable {}里面也有一个
1 | <span style= "color: red;" > public static SQLiteDatabase openOrCreateDatabase(String path, CursorFactory factory) {</span> |
2 | <span style= "color: red;" > return openDatabase(path, factory, CREATE_IF_NECESSARY);</span> |
3 | <span style= "color: red;" > }</span> |
相同的方法,只是参数不同,这个可以传一个路径进去,我们就调用这个方法。然后我们还要有一个我们指定文件夹的路径的方法:
01 | public File getDatabasePath(String name) { |
02 | String EXTERN_PATH = null ; |
04 | if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)== true ) |
07 | EXTERN_PATH = android.os.Environment.getExternalStorageDirectory().getAbsolutePath() |
09 | File f= new File(EXTERN_PATH); |
15 | return new File(EXTERN_PATH+ name); |
及对SDcard进行写和读的权限:
1 | <!-- 在SDCard中创建于删除文件权限 --> |
2 | <uses-permission android:name= "android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> |
4 | <uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" /> |
最后当我们创建数据库的时候直接继承我们自己定义的SDSQLiteOpenHelper(),不用系统自带SQLiteOpenHelper()即可。
转帖:http://bg135.com/save-to-sdcard-database.html