Android Studio 拷贝使用外部数据库
1.将数据库文件放入资源下的raw文件下,如果没有raw文件夹在res下自己创建
2.打开数据库思路:
(1)首先判断数据文件是否存在,若存在直接根据路径打开数据库即可。
(2)若数据库文件不存在,则需通过代码将raw下的资源文件拷贝到 /data/data/com.*.*(package name)/ 目录下
(3)打开数据库,对其进行操作即可。
3.例子
(1)创建test.db数据库,同时建立person表,并且插入两条数据,然后将数据库复制到raw文件下
(2)DbManager类
package com.example.mrz.dbapplication; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.os.Environment; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; /** * Created by MrZ on 2016/3/26. */ public class DbManager { private final int BUFFER_SIZE = 400000; public static final String DB_NAME = "test.db"; //数据库名字 public static final String PACKAGE_NAME = "com.example.mrz.dbapplication";//包名 public static final String DB_PATH = "/data" + Environment.getDataDirectory().getAbsolutePath() + "/" + PACKAGE_NAME; //数据库的绝对路径( /data/data/com.*.*(package name)) private SQLiteDatabase db; private Context context; public DbManager(Context context) { this.context = context; } //对外提供的打开数据库接口 public void openDataBase() { this.db = this.openDataBase(DB_PATH + "/" + DB_NAME); } //获取打开后的数据库 public SQLiteDatabase getDb() { return this.db; } // 本地打开数据方法 private SQLiteDatabase openDataBase(String filePath) { try { File file = new File(filePath); if (!file.exists()) { //判断文件是否存在 //通过输入流和输出流,把数据库拷贝到"filePath"下 InputStream is = context.getResources().openRawResource(R.raw.test);//获取输入流,使用R.raw.test资源 FileOutputStream fos = new FileOutputStream(file); byte[] buffer = new byte[BUFFER_SIZE]; int readCount; while((readCount = is.read(buffer))>0){ fos.write(buffer,0,readCount); } fos.close(); is.close(); } //打开数据库 SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(filePath,null); return db; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } //关闭数据库 public void closeDataBase() { if(this.db!=null)db.close(); } }
(3)MainActivity实现
package com.example.mrz.dbapplication; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onResume() { super.onResume(); //在子线程中进行对数据库的打开操作 new Thread(new Runnable() { @Override public void run() { DbManager manager = new DbManager(MainActivity.this); manager.openDataBase(); SQLiteDatabase db = manager.getDb(); Cursor cursor = db.query("person", null, null, null, null, null, null); if (cursor.moveToNext()) { int nameIndex, ageIndex, sexIndex; nameIndex = cursor.getColumnIndex("name"); ageIndex = cursor.getColumnIndex("age"); sexIndex = cursor.getColumnIndex("sex"); do { String name = cursor.getString(nameIndex); int age = cursor.getInt(ageIndex); String sex = cursor.getString(sexIndex); //使用Log查看数据,未在界面展示 Log.d("DbTest","name:"+name+" age:"+age+" sex:"+sex); }while(cursor.moveToNext()); } manager.closeDataBase(); } }).start(); } }
(4)注意需要添加权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
(5)输出结果