參考博客
//http://blog.csdn.net/lime110/article/details/50685095 //http://www.cnblogs.com/linjzong/p/5045839.html
按照國際慣例,先來一段扯淡,最近的項目,數據顯示錯誤,方便測試測出問題後可以導出數據庫給我看,所以就直接把數據庫設置到內存卡上了
找了兩個博客參考(非常感謝對於知識的分享,感謝!)
1,要設置數據庫的路徑,當然要有數據庫。
數據庫助手類,能不寫的都不寫了,畢竟重點是設置數據庫的路徑。。。(這個類,並沒有什麼不同的地方)
/** * Created by Administrator on 2017/9/17. */ public class DBHelper extends SQLiteOpenHelper { public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context,name, factory, version); } public DBHelper(Context context, String name, int version) { this(context, name, null, version); } public DBHelper(Context context, String name) { this(context,name,1); } //數據庫創建(初始化的時候被調用) @Override public void onCreate(SQLiteDatabase db) { //執行語句創建表 String createTable ="create table personTest(id int,name varchar(10))"; db.execSQL(createTable); } //數據庫更新的時候被調用 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
2創建數據庫,在MainActivity中調用下面的代碼即可創建數據庫,我們不設置路徑的時候,把手機root或者運行在模擬器上就可以看到數據庫的位置位於:data/data/項目包名/databases
DBHelper helper = new DBHelper(MainActivity.this,"test.db");
SQLiteDatabase db = helper.getWritableDatabase(); //數據庫onCreate方法這個時候被調用
怎樣自定義路徑呢?
如果你看 了我參考的兩篇博文,我想你已經想到了。。其實賊簡單,就是在創建數據庫的前面加上要保存的路徑
pathname = Environment.getExternalStorageDirectory().getPath(); //數據庫路徑 DBHelper helper = new DBHelper(MainActivity.this,pathname+"/"+"test.db"); SQLiteDatabase db = helper.getWritableDatabase(); //數據庫onCreate方法這個時候被調用
完整代碼
數據庫助手類:
/** * Created by Administrator on 2017/9/17. */ public class DBHelper extends SQLiteOpenHelper { public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context,name, factory, version); } public DBHelper(Context context, String name, int version) { this(context, name, null, version); } public DBHelper(Context context, String name) { this(context,name,1); } //數據庫創建(初始化的時候被調用) @Override public void onCreate(SQLiteDatabase db) { //執行語句創建表 String createTable ="create table personTest(id int,name varchar(10))"; db.execSQL(createTable); } //數據庫更新的時候被調用 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
佈局文件就一個按鈕(代碼就不貼出了)
MainActivity(點擊按鈕的時候創建數據庫,爲了兼容Android6.0所以動態申請了內存卡的讀寫權限)
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private String pathname; //數據庫路徑 private Button button1; private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { "android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(this); } @Override public void onClick(View v) { Toast.makeText(MainActivity.this,""+ Environment.getExternalStorageDirectory().getPath(),Toast.LENGTH_SHORT).show(); Log.e("aa", "onCreate: "+Environment.getExternalStorageDirectory().getPath() ); //運行程序的時候會自動創建數據庫,創建表 pathname = Environment.getExternalStorageDirectory().getPath(); //數據庫路徑及名稱 DBHelper helper = new DBHelper(MainActivity.this,pathname+"/"+"test.db"); SQLiteDatabase db = helper.getWritableDatabase(); //數據庫onCreate方法這個時候被調用 //http://blog.csdn.net/lime110/article/details/50685095 //http://www.cnblogs.com/linjzong/p/5045839.html } //判斷是否有內存卡讀權限 public static void verifyStoragePermissions(Activity activity) { try { //檢測是否有寫的權限 int permission = ActivityCompat.checkSelfPermission(activity, "android.permission.WRITE_EXTERNAL_STORAGE"); if (permission != PackageManager.PERMISSION_GRANTED) { // 沒有寫的權限,去申請寫的權限,會彈出對話框 ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE); } } catch (Exception e) { e.printStackTrace(); } } }
清單文件:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 在SDCard中創建與刪除文件權限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
這樣就完成了自定義路徑:一句話講曬:就是在創建數據庫:name前面加上要保存到的數據庫路徑。。可以看到在手機數據庫已經保存到我們想要的路徑了。。。
這些代碼:我只是在模擬器和三星s6直板運行過,都可以實現自定義數據庫路徑,不知道在別的手機會不會遇到兼容性問題
踩到的坑:數據庫的名字要是: .db爲後綴,否則會報錯