android 数据库文件复制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 数据库文件复制相关的知识,希望对你有一定的参考价值。

程序需要访问的sqlite数据库文件里有几万条数据,sqlite数据库文件存放在Eclipse的项目\res\raw文件夹下,现在程序里想要访问数据库,好像要将数据库复制到/data/data/项目package/databases/下,但是我一直复制不了,请各位提供一段完整有效的代码

参考技术A // 检查数据库是否有效
private boolean checkDataBase()
// SQLiteDatabase checkDB = null;
// String myPath = DB_PATH + DB_NAME;
File file = new File(DB_PATH, DB_NAME);
return file.exists();



public DBCtrl(Context context)
super();
synchronized (lock)
this.context = context;
DB_PATH = context.getResources().getString(R.string.dbpath);
boolean dbExist = checkDataBase();

if (dbExist)
// 数据库已存在,do nothing.
else
// 创建数据库
try
File dir = new File(DB_PATH);
if (!dir.exists())
dir.mkdirs();

File dbf = new File(DB_PATH + DB_NAME);
if (dbf.exists())
dbf.delete();

// SQLiteDatabase.openOrCreateDatabase(dbf, null);
// 复制asseets中的db文件到DB_PATH下
copyDataBase();
catch (IOException e)
throw new Error("数据库创建失败");






private void copyDataBase() throws IOException
// Open your local db as the input stream
InputStream myInput = context.getResources()
.openRawResource(R.raw.db);
// Path to the just created empty db
String outFileName = DB_PATH + DB_NAME;
// Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
// transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0)
myOutput.write(buffer, 0, length);

// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();

//



我用的这个 构造 helper时候没有数据库就复制了
我觉得你失败的原因不是复制有问题而是数据太大了
android2.3以前不能直接读大于1m的资源的
你把数据库分割成小块复制过来时拼起来吧本回答被提问者采纳
参考技术B android 数据库文件复制并不一定要创建数据库然后插入数据的过程。譬如,需要提供一个大数据量资源的搜索功能。像号码归属地,城市列表,ip归属地等。此时如果键数据库,再将数据一条一条insert到数据库中,不仅耗时,占用资源,有时还会导入错误。
1、将数据库建好,数据insert好,并将该beifen.db文件放在raw(如果没有,在res目录下建一个)目录下。在创建数据库时,直接将该文件拷贝到databases目录下:DATABASES_DIR="/data/data/yourpackagedir/databases", DATABASE_NAME="beifen.db"。
2、可以在运行ContentProvider的query(一般拷贝数据库都是用于查询的)时,做一次拷贝检测
[java] view plaincopyprint?
copyDatabaseFile(context, false)
如果该文件没有,则拷贝,如果有,不拷贝。

Android复制res/raw目录的文件到SD卡下

前言

       在应用开发中,我们会经常遇到操作工程中assets和res/raw目录下的文件,那么这两个目录有什么用呢?assets和res/raw工程目录下都可以存放一些小于1M(2.3版本以前要求,否则将不能读出数据。),这些文件将被打包到APK中供应用使用。assets目录下的文件将不做任何处理被打包,而res/raw目录下的文件,有些文档说会编译为二进制,有些文档说不会。有一个原则就是最好不要将过大的文件打包到APK中,如果你的资源很大,例如视频文件等等,应该单独存储在文件系统中。       assets和res/raw目录的相同点:
  • 两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
    res/raw和assets的不同点:
  • res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源id即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
  • res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹。

目录结构图




复制res/raw目录的文件到指定目录

 private static final String SEPARATOR = File.separator;//路径分隔符

/**
     * 复制res/raw中的文件到指定目录
     * @param context 上下文
     * @param id 资源ID
     * @param fileName 文件名
     * @param storagePath 目标文件夹的路径
     */
    public static void copyFilesFromRaw(Context context, int id, String fileName,String storagePath)
        InputStream inputStream=context.getResources().openRawResource(id);
        File file = new File(storagePath);
        if (!file.exists()) //如果文件夹不存在,则创建新的文件夹
            file.mkdirs();
        
        readInputStream(storagePath + SEPARATOR + fileName, inputStream);
    

    /**
     * 读取输入流中的数据写入输出流
     *
     * @param storagePath 目标文件路径
     * @param inputStream 输入流
     */
    public static void readInputStream(String storagePath, InputStream inputStream) 
        File file = new File(storagePath);
        try 
            if (!file.exists()) 
                // 1.建立通道对象
                FileOutputStream fos = new FileOutputStream(file);
                // 2.定义存储空间
                byte[] buffer = new byte[inputStream.available()];
                // 3.开始读文件
                int lenght = 0;
                while ((lenght = inputStream.read(buffer)) != -1) // 循环从输入流读取buffer字节
                    // 将Buffer中的数据写到outputStream对象中
                    fos.write(buffer, 0, lenght);
                
                fos.flush();// 刷新缓冲区
                // 4.关闭流
                fos.close();
                inputStream.close();
            
         catch (FileNotFoundException e) 
            e.printStackTrace();
         catch (IOException e) 
            e.printStackTrace();
        


    

在需要的地方调用以上源码
FileStorageHelper.copyFilesFromRaw(this,R.raw.doc_test,"doc_test",path + "/" + "mufeng");

复制asset目录的文件到SD卡下

参考: Android复制asset目录的文件到SD卡下

以上是关于android 数据库文件复制的主要内容,如果未能解决你的问题,请参考以下文章

试图在 Android 中复制 SQLite 数据库并得到“没有这样的文件或目录”

如何sqllite数据库复制到android手机上

通过 Eclipse 在 Android 应用程序中包含数据库文件

ZipOutputStream 在 Android 上生成损坏的 zip 文件

Android 复制粘贴后的图片无法打开

以编程方式从应用程序的资产文件夹复制数据库文件