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爲後綴,否則會報錯


發佈了29 篇原創文章 · 獲贊 65 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章