Android設定資料庫的路徑
阿新 • • 發佈:2019-01-31
參考部落格
//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為字尾,否則會報錯