Android Studio 拷贝使用外部数据库

1.将数据库文件放入资源下的raw文件下,如果没有raw文件夹在res下自己创建

Android Studio 拷贝使用外部数据库

Android Studio 拷贝使用外部数据库

Android Studio 拷贝使用外部数据库Android Studio 拷贝使用外部数据库

2.打开数据库思路:

  (1)首先判断数据文件是否存在,若存在直接根据路径打开数据库即可。

  (2)若数据库文件不存在,则需通过代码将raw下的资源文件拷贝到 /data/data/com.*.*(package name)/ 目录下

  (3)打开数据库,对其进行操作即可。

3.例子

   (1)创建test.db数据库,同时建立person表,并且插入两条数据,然后将数据库复制到raw文件下

Android Studio 拷贝使用外部数据库

   (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)输出结果

Android Studio 拷贝使用外部数据库