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

   日期:2020-05-19     浏览:111    评论:0    
核心提示:忙碌了一天,总算摸清了里面的套路与步骤,现总结如下:首先我们要知道,安卓是无法直接操作项目某个文件夹下的SQLite数据库的,因此我们首先得把数据库移到移动设备上/data/data/你的包名/databases文件夹下,安卓自己创建的数据库也是放在这个地方。第一步,检查你项目res目录下是否有raw文件夹,没有的话就自己新建一个,如下所示:第二步, 将想要移动的数据库放进raw目录下,如下:第三步,将数据库移动到目标文件夹下,代码如下:package com.example.edm;impo数据库

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

首先我们要知道,安卓是无法直接操作项目某个文件夹下的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等专用类对该数据库文件进行操作了,不再赘述。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服