参考博客
//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(); } } }
清单文件:
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
android:name="android.permission.READ_EXTERNAL_STORAGE" />
这样就完成了自定义路径:一句话讲晒:就是在创建数据库:name前面加上要保存到的数据库路径。。可以看到在手机数据库已经保存到我们想要的路径了。。。
这些代码:我只是在模拟器和三星s6直板运行过,都可以实现自定义数据库路径,不知道在别的手机会不会遇到兼容性问题
踩到的坑:数据库的名字要是: .db为后缀,否则会报错