1.先在AS中右键单击res目录,New-Folder-Raw Resources Folder,然后将已有的数据库文件放入Raw目录下
2.创建一个工具类ImportDB
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import com.jabal.arabic.R;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class ImportDB {
private final int BUFFER_SIZE = 400000;
public static final String DB_NAME = "test.db"; //保存的数据库文件名
public static final String PACKAGE_NAME = "自己的包名";//此处改为自己应用的包名。
public static final String DB_PATH = "/data/data/"
+ PACKAGE_NAME+"/databases"; //在手机里存放数据库的位置
private SQLiteDatabase database;
public Context context;
public ImportDB(Context context) {
this.context = context;
}
public void openDatabase() {
this.database = this.openDatabase(DB_PATH + "/" + DB_NAME);
}
public SQLiteDatabase openDatabase(String dbfile) {
try {
if (!(new File(dbfile).exists()))
{
//没有创建文件夹
File f=new File(DB_PATH);
if (!f.exists()){
f.mkdir();
}
//判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库
InputStream is = this.context.getResources().openRawResource(
R.raw.arabic); //欲导入的数据库
FileOutputStream fos = new FileOutputStream(new File(dbfile));
byte[] buffer = new byte[BUFFER_SIZE];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
}
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile,
null);
return db;
} catch (FileNotFoundException e) {
Log.e("Database", "File not found");
e.printStackTrace();
} catch (IOException e) {
Log.e("Database", "IO exception");
e.printStackTrace();
}
return null;
}
//do something else h
public void closeDatabase() {
this.database.close();
}
}
在Activity中使用此类即可
public ImportDB importDB;
importDB = new ImportDB(this);
importDB.openDatabase();
使用例子
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private EditText name;
private TextView result_address;
private Button query;
public ImportDB importDB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
Intent intent = new Intent(this, MainActivity_home.class);
//创建Intent对象,Intent用于各组件之间通讯构造方法的参数
//第一个参数是当前activity.this
//第二个参数是要跳转的界面对应的activity.class
startActivity(intent);
//启动
finish();
//最后记得关掉这个activity否则内存越占越多
*/
init();
name = findViewById(R.id.explain);
query = findViewById(R.id.query_button);
result_address = findViewById(R.id.result);
query.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db=SQLiteDatabase.openOrCreateDatabase(ImportDB.DB_PATH + "/" + ImportDB.DB_NAME, null);
StringBuilder sb = new StringBuilder();
//参数依次是:表名,列名,where约束条件,where中占位符提供具体的值,指定group by的列,进一步约束
//指定查询结果的排序方式
Cursor cursor = db.query("test_word", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
String word = cursor.getString(cursor.getColumnIndex("word"));
String explain = cursor.getString(cursor.getColumnIndex("explain"));
sb.append(explain +"--"+word+ "\n");
} while (cursor.moveToNext());
}
cursor.close();
result_address.setText(sb.toString());
//Toast.makeText(getApplicationContext(), sb.toString(), Toast.LENGTH_SHORT).show();
}
});
}
private void init()
{
importDB = new ImportDB(this);
importDB.openDatabase();
}
}
ps:另外据网上所说数据库太大的话还需要分割
android开发如何获取res/raw和assets文件夹的路径
android开发如何获取res/raw和assets文件夹的路径,主要分为两种情况:
1.如果你只是拷贝动作,那么你只需要得到res/raw和assets文件输入流就可以,方法如下:
//获取res/raw文件输入流
InputStream is=getResources().openRawResource(R.raw.XXX);
//获取assets文件输入流
InputStream is=getResources().getAssets().open("文件名");
2.如果你想对res/raw和assets文件写的动作,那就要得到相应uri,方法如下:
//获取res/raw的uri
Uri uri=Uri.paese("android:resource://包名/"+R.raw.xxx);