安卓开发中到底怎么使用外部已经准备好的sqlite数据库?

忙碌了一天,总算摸清了里面的套路与步骤,现总结如下:

首先我们要知道,安卓是无法直接操作项目某个文件夹下的SQLite数据库的,因此我们首先得把数据库移到移动设备上/data/data/你的包名/databases文件夹下,安卓自己创建的数据库也是放在这个地方。

第一步,检查你项目res目录下是否有raw文件夹,没有的话就自己新建一个,如下所示:在这里插入图片描述
第二步, 将想要移动的数据库放进raw目录下,如下:在这里插入图片描述第三步,将数据库移动到目标文件夹下,代码如下:

package com.example.edm;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;
import android.util.Log;

public class MyDatabaseHelper {
    private final int BUFFER_SIZE = 500000;
    public static final String DB_NAME = "single18.db"; //保存的数据库文件名
    public static final String PACKAGE_NAME = "com.example.edm";//包名
    public static final String DB_PATH = "/data"
            + Environment.getDataDirectory().getAbsolutePath() + "/"
            + PACKAGE_NAME + "/databases";  //存放数据库的位置
    String dbfile=DB_PATH+"/"+DB_NAME;
    private SQLiteDatabase database;
    private Context context;
    public MyDatabaseHelper(Context context){
        this.context = context;
    }
    public void openDatabase() {
        File dFile=new File(DB_PATH);//判断路径是否存在,不存在则创建路径
        if (!dFile.exists()) {
            dFile.mkdir();
        }
        this.database = this.openDatabase(DB_PATH + "/" + DB_NAME);
    }
    private SQLiteDatabase openDatabase(String dbfile) {
        try {
            if (!(new File(dbfile).exists())) {
                InputStream is = this.context.getResources().openRawResource(
                        R.raw.single18); //想要导入的数据库在这里
                FileOutputStream fos = new FileOutputStream(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;
    }
    public void closeDatabase() {
        this.database.close();
    }
}


这里有个值得注意的地方,就是db文件命名的时候要写成英文,否则使用R.raw.db_name时会找不到该文件,我也不知道怎么回事。。。
调用:

myDatabaseHelper=new MyDatabaseHelper(SingleSubjectActivity.this);
myDatabaseHelper.openDatabase();
myDatabaseHelper.closeDatabase();

这样就将single18.db移到了/data/data/packagename/databases下,这里要注意,由于是在真机调试的情况下完成该操作的,事后可能你在目标文件夹下是找不到db文件的,得先停止调试,然后重新调试,进入Device File Exploer才能看见新导入的db文件。本人操作时就遇到了这种情况,我一直以为没有移动成功,一直调试。。白白浪费了时间。这里之所以说可能找不到,是因为可能我的代码有点问题。

最后,就可以用SQLiteOpenHelper等专用类对该数据库文件进行操作了,不再赘述。

原创文章 22 获赞 83 访问量 9450

猜你喜欢

转载自blog.csdn.net/Cyril_KI/article/details/106163825
今日推荐