Android Studio 拷贝使用外部数据库

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

Android Studio 拷贝使用外部数据库_第1张图片
Android Studio 拷贝使用外部数据库_第2张图片 Android Studio 拷贝使用外部数据库_第3张图片
2.打开数据库思路:
  (1)首先判断数据文件是否存在,若存在直接根据路径打开数据库即可。
  (2)若数据库文件不存在,则需通过代码将raw下的资源文件拷贝到  /data/data/com.*.*(package name)/ 目录下
  (3)打开数据库,对其进行操作即可。
3.例子
   (1)创建test.db数据库,同时建立person表,并且插入两条数据,然后将数据库复制到raw文件下
Android Studio 拷贝使用外部数据库_第4张图片
   (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)注意需要添加权限
android:name="android.permission.READ_EXTERNAL_STORAGE"/>
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 (5)输出结果
Android Studio 拷贝使用外部数据库_第5张图片

你可能感兴趣的:(Android,sqlite,数据库)