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