开发用到数据库,真机运行时想把数据库copy到SD卡中。可是老是不成功,程序也不报错,就是复制不了。求教
数据库存放在res\raw\mobilephone1.db
数据库大小10M。
也设置了权限 允许往SD卡中写数据。
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
我这样的读取方式可行吗?
很纠结,一直copy不成功。哎~
求各位指教。在此先谢过了~
private final String DATABASE_PATH = android.os.Environment  
            .getExternalStorageDirectory().getAbsolutePath()  
            + "/mobilephone";  
private final String DATABASE_FILENAME = "mobilephone.db"; 
private SQLiteDatabase openDatabase()  
{  
    try  
    {  
        // 获得mobilephone.db文件的绝对路径  
        String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;  
        File dir = new File(DATABASE_PATH);       
        // 如果/sdcard/mobilephone目录中存在,创建这个目录  
        if (!dir.exists()) {  
         dir.mkdir();  
         }
        // 如果在/sdcard/mobilephone目录中不存在           
        // mobilephone.db文件,则从res\raw目录中复制这个文件到  
        // SD卡的目录(/sdcard/mobilephone)  
        if (!(new File(databaseFilename)).exists())  
        {  
        
            // 获得封装mobilephone.db文件的InputStream对象  
            InputStream is = getResources().openRawResource(R.raw.mobilephone1);  
            FileOutputStream fos = new FileOutputStream(databaseFilename);  
            
            int count = 0;
            while (count == 0) {
             count = is.available();
            }
            byte[] buffer = new byte[count];
            
            int readCount = 0; // 已经成功读取的字节的个数
            while (readCount < count) {
             readCount += is.read(buffer, readCount, count - readCount);
            }
            
            fos.write(buffer, 0, count); 
            fos.close();  
            is.close();  
        }  
        // 打开/sdcard/mobilephone目录中mobilephone.db文件  
        SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(  
               databaseFilename, null);  
        return database;  
    }  
    catch (Exception e)  
    {  
    }  
    return null;  
}  

解决方案 »

  1.   

     复制数据库,到指定位置,我自己写的,测试没问题,你看看
    数据库放在assets目录下
       private void copyDataBase() throws IOException 
       {
               // Open your local db as the input stream
       InputStream myInput = null;
       //获取assets下的资源文件 
       myInput = myContext.getResources().getAssets().open(DatabaseOperating.DATABASE_NAME);
               // Path to the just created empty db
       //文件存储到哪里的路径
               String outFileName = DatabaseOperating.SD_PATH
    + DatabaseOperating.DB_PATH + DatabaseOperating.DATABASE_NAME;
               //首先创建文件夹
               String OutPutPath =DatabaseOperating.SD_PATH+DatabaseOperating.DB_PATH;
               
               File OutputFile = new File(OutPutPath);
               //输出文件夹不存在,则创建
         if (!OutputFile.exists())
         {
         OutputFile.mkdirs();
         }
               
               OutputStream myOutput = null;
               try
               {
                myOutput = new FileOutputStream(outFileName);
               }
               catch(IOException e)
               {
               
               }
               //复制文件 
             
               byte[] buffer = new byte[1024];
               int length;
               while ((length = myInput.read(buffer)) > 0) {
                       myOutput.write(buffer, 0, length);
               }
               myOutput.flush();
               myOutput.close();
               myInput.close();
       }
      

  2.   

    当程序被安装在真机上时,点击程序运行时,在主界面的Activity的onCreate()方法中添加如下代码。
    该代码只被执行一次,就是没有找到数据库时。// databases目录是准备放sqlite数据库的地方,也是android程序默认的数据库存储目录
    // 数据库名为restaurant.db
    String DB_PATH = "/data/data/com.treasure.takeout.ui/databases/";
    String DB_NAME="restaurant.db";
    // 检查sqlite数据库文件是否存在
    if ((new File(DB_PATH + DB_NAME)).exists() == false)
    {
            // 如sqlite数据库文件不存在,再检查一下databases目录是否存在
            File f = new File(DB_PATH);
            // 如database目录不存在,新建该目录
            if (!f.exists())
            {
             f.mkdir();
            }
            try 
            {
    // 得到assets目录下我们实现准备好的sqlite数据库作为输入流
             InputStream is = getBaseContext().getAssets().open(DB_NAME);
             // 输出流
             OutputStream os = new FileOutputStream(DB_PATH + DB_NAME);
             // 文件写入
             byte[] buffer = new byte[1024];
             int length;
             while ((length = is.read(buffer)) > 0)
             {
             os.write(buffer, 0, length);
             }
             // 关闭文件流
             os.flush();
             os.close();
             is.close();

            catch (Exception e)
    {
    }
    }注意:当程序被安装到真机上之前,需要将创建好的数据库放在assets目录里。
      

  3.   

    试试这个
    File sd = Environment.getExternalStorageDirectory();File src = new File(DB_PATH + DATABASE_NAME);File dest = new File(sd +  "/" +DATABASE_NAME);      try 
          {
              if (Environment.getExternalStorageDirectory().canWrite()) 
              {                 
                  if (srcdb.exists()) 
                  {
                      FileChannel src = new FileInputStream(srcdb).getChannel();
                      FileChannel dst = new FileOutputStream(destdb).getChannel();
                      dst.transferFrom(src, 0, src.size());
                      src.close();
                      dst.close();  
                      flag=0;               }
                  else
                  {
                      Toast.makeText(getApplicationContext(), "ERROR: File not found in Database " , Toast.LENGTH_LONG).show();                    
                  }
              }
              else
              {
                  Toast.makeText(getApplicationContext(), "ERROR: Cannot write to file" , Toast.LENGTH_LONG).show();
              }
          }
          catch (Exception e) 
          {
              Log.e("Movedb", "Error in Copying" + e.toString());      }也许你只需要一个许可的权限
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>