android下访问已存在的sqlite数据库文件的办法

问题来源:android下的sqlite数据库一般都是单机的,当一个应用中数据库的数据多的时候,每换一个机子都重新配置一下数据库中所有数据显然是浪费时间的,所以最好的办法就是可以访问一个已经存在的数据库。
解决方案
方案一:在Eclipse中操作,仅仅限于模拟器使用。
步骤:

  • 在Eclipse打开File Explorer视图, File Explorer是用来查看设备的文件的, 打开方式为在Eclipse中执行【Window】-【Show View】-【other】-【File Explorer】操作。
  • 找到要导入文件的位置,也就是数据库默认的位置/data/data/<包名>/database目录。
  • 选中目录,然后点右上角位置的设备图标【Pull a file from the device】,然后选择要上传的数据库即可。
    图示如下:
    这里写图片描述

方案二:将数据库放到res/raw目录下,在第一次数据访问数据库时拷贝纸/data/data/<包名>/database目录下,模拟器和真机都适用。
拷贝的代码如下:

try {
                String filePath = context.getCacheDir().getAbsolutePath();
                String DATABASE_PATH = filePath.substring(0, filePath.length() - 5)
                        + "databases";
                String DATABASE_FILENAME = "usmartscada.db";
                String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
                File dir = new File(DATABASE_PATH);

                if (!dir.exists()) {
                    dir.mkdir();
                }

                if (!(new File(databaseFilename)).exists()) {
                    InputStream is = context.getResources().openRawResource(R.raw.usmartscada);;
                    FileOutputStream fos = new FileOutputStream(databaseFilename);
                    byte[] buffer = new byte[8192];
                    int count = 0;
                    // 开始复制文件
                    while ((count = is.read(buffer)) > 0) {
                        fos.write(buffer, 0, count);
                    }
                    fos.close();
                    is.close();
                }
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

上面的代码例子数据库的名字为usmartscada.db ,同时证明了复制进来的数据库可以正常进行读取和写入,不存在权限不够不能读取和写入的问题, 但是上面的代码会有几个问题。

  1. 为什么要把已存在数据库文件放在res/raw文件夹下, 放在其它地方可以吗?
    如果放在res/raw文件夹下,数据库文件在apk打包的时候就必须确定并且不可更改,否则每次都要重新编译生成apk,在使用的时候会很麻烦,所以最好是将数据库文件放置在sd卡的某个位置。

    经过验证得知,数据库文件可以放置到其它位置,例如sd卡的某个位置,至于放在什么位置根据具体情景来觉得,上面的代码只是一个例子而已,当然放在不同的位置,访问文件的时候的方式也不一样。当然注意要访问sd卡的时候一定要在AndroidManifest.xml文件中添加访问sd卡的权限。

  2. 上面的代码没有判断已存在的数据库文件是否存在?一是为了代码的严谨性考虑,二是因为在特殊的机子上可能不需要之前已经存在的数据库,希望自己配置并生成数据库,此时就不需要复制之前的数据库。
    这个问题根据实际情景来决定是否需要判断已存在的数据库文件是否存在,判断的时候根据数据库文件放置的位置不同而不同,另外如果防止在res/raw文件夹下没有办法判断数据库文件是否存在,因为访问res/raw文件夹下的文件使用的方法是R.raw.xxx,如果文件不存在,没办法得到数据库文件的对象,所以也就没办法判断,补充一个知识res/raw文件夹下的文件的绝对路径是”android.resource://”+ getPackageName() + R.raw.xxx。

猜你喜欢

转载自blog.csdn.net/li1500742101/article/details/48519841