1. 程式人生 > >Android設定資料庫的路徑

Android設定資料庫的路徑

參考部落格

//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為字尾,否則會報錯