五-在Android开发中--导入外部已有的数据库

114 阅读2分钟

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);