2017-02-02 2 views
0

作成したデータベースのsqliteファイルをアンドロイドメモリからsdcardにコピーしようとしていますが、「コピーに失敗しました」というエラーが表示されています。それは簡単にコピーすることができるようにデータベースのsqliteファイルを作成する方法はありますか?デバイスのどこにでもアクセス許可を設定する必要がありますか?どのようにsdcardにアンドロイドデータベースsqliteファイルをコピーするには?

+1

呼び出されたときに移入されEditTextであるあなたは、'設定したのですか? –

+0

'簡単にコピーできるようにデータベースのsqliteファイルを作成する方法はありますか?奇妙な質問。ファイルをコピーする場合は、すでにファイルが存在するはずです。 – greenapps

+0

データベースファイルがSQLiteDatabaseクラスによって作成/読み込まれる場所を指定することができます。なぜコピーする必要がありますか? –

答えて

0

はいあなたがアクセス権が必要ですし、23未満の場合はどのようにAPIに依存して、あなたはあなたのマニフェスト(のAndroidManifest.xml)で

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

を持っている必要があります。

23以上の場合は、特にAccsessを要求する必要があります。例えばアクティビティで(私はそれは常にをチェックされているので、MainActivityでこれを持っている)持っている: -

if(Build.VERSION.SDK_INT >= 23) { 
      ExternalStoragePermissions.verifyStoragePermissions(this); 
     } 

ExternalStoragePermissionsクラスは次のとおりです。 -

class ExternalStoragePermissions { 

    public int API_VERSION = Build.VERSION.SDK_INT; 
    private static final int REQUEST_EXTERNAL_STORAGE = 1; 
    private static String[] PERMISSIONS_STORAGE = { 

      //Manifest.permission.READ_EXTERNAL_STORAGE, 
      Manifest.permission.WRITE_EXTERNAL_STORAGE 
    }; 
    public static final String THISCLASS = ExternalStoragePermissions.class.getSimpleName(); 

    public ExternalStoragePermissions() {} 
    // Note call this method 
    public static void verifyStoragePermissions(Activity activity) { 

     int permission = ActivityCompat.checkSelfPermission(
       activity, 
       Manifest.permission.WRITE_EXTERNAL_STORAGE); 

     if(permission != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(
        activity, 
        PERMISSIONS_STORAGE, 
        REQUEST_EXTERNAL_STORAGE 
      ); 
     } 
    } 
} 

これは、アクセスを許可するようにユーザに促します。

PS私は両方の状況に対処するように両方のコードをエンコードしています。

実際には、バックアップがコピーであるバックアップ/リストアが機能しています。しかし、それはかなり長く巻き込まれているかもしれません。私は多くの状況を処理しようとしました。私は実際にダウンロードフォルダに作成されたフォルダにバックアップします。

PS SQLite Managerのようなものがあれば、ファイルをPCにコピーして開くこともできます(接続する)。私はこれを使ってクエリなどをテストします。あなたはデータベースを修正してそれを元に戻すこともできます(リストア側のため非常に簡単です)。私は非SQLiteファイルをコピーして元の状態から復元すると何が起きるか見ていました(基本的には対処していますが、アプリケーションを閉じてから再開して予期しない結果を回避する必要があります)。この長さ/畳み込みの例として

は私が最初のチェックの一つである: - :これらは

/************************************************************************** 
* method saveDB save a file copy of the Database 
*/ 
private void saveDB() { 

    busy.show(); 
    errlist.clear(); 
    confirmaction = true; 
    String dbfilename = this.getDatabasePath(
      DBConstants.DATABASE_NAME).getPath(); 
    dbfile = new File(dbfilename); 
    backupfilename = directory.getText().toString() + 
      "/" + 
      backupfullfilename.getText().toString(); 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       FileInputStream fis = new FileInputStream(dbfile); 
       OutputStream backup = new FileOutputStream(backupfilename); 

       //byte[] buffer = new byte[32768]; 
       int length; 
       while((length = fis.read(buffer)) > 0) { 
        backup.write(buffer, 0, length); 
       } 
       backup.flush(); 
       backup.close(); 
       fis.close(); 
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
       errlist.add("Database backup failed with an IO Error. Error Message was " + 
         e.getMessage() + 
         "/n/tFile Name was " + 
         backupfilename); 
       confirmaction = false; 
      } 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        busy.dismiss(); 
        AlertDialog.Builder dbbackupresult = new AlertDialog.Builder(context); 
        dbbackupresult.setCancelable(true); 
        if(confirmaction) { 
         dbbackupresult.setTitle("DB Data Backed up OK."); 
         dbbackupresult.setMessage("DB Data successfully saved in file \n\t" + 
           backupfilename); 
        } else { 
         dbbackupresult.setTitle("DB Backup Failed."); 
         String emsg = ""; 
         for(int i = 0; i < errlist.size(); i++) { 
          emsg = emsg + errlist.get(i); 
         } 
        } 
        dbbackupresult.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 

         } 
        }).show(); 
       } 
      }); 
     } 
    }).start(); 

注 - 私が使用バックアップ自体の

// External Storage must be mounted. 
    String chkmnt = Environment.getExternalStorageState(); 

    if(!(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))) { 
     switch (Environment.getExternalStorageState()) { 
      case Environment.MEDIA_SHARED : { 
       errorlist.add(
         "Although External Storage is present." + 
           " It cannot be used as it's in use via USB." + 
           "\nDisconnect the USB cable and then try again." 
       ); 
       break; 
      } 
      case Environment.MEDIA_REMOVED : { 
       errorlist.add(
         "External Storage is not present." + 
           "\nInsert an SC Card." 
       ); 
       break; 
      } 
      case Environment.MEDIA_EJECTING : { 
       errorlist.add(
         "External Storage is being ejected." + 
           "\nRe-insert the SD Card." 
       ); 
       break; 
      } 
      case Environment.MEDIA_NOFS : { 
       errorlist.add(
         "External Storage is blank or does not have the correct" + 
           " filesystem present." + 
           "\nUse a valid SDCard." 
       ); 
       break; 
      } 
      case Environment.MEDIA_BAD_REMOVAL : { 
       errorlist.add(
         "External Storage was removed incorrectly." + 
           "\nRe-insert the SD Card, if this fails then" + 
           " try restarting the device." 
       ); 
       break; 
      } 
      case Environment.MEDIA_CHECKING : { 
       errorlist.add(
         "External Storage is unavailable as it is being checked." + 
           "\nTry again." 
       ); 
      } 
      case Environment.MEDIA_MOUNTED_READ_ONLY : { 
       errorlist.add(
         "External Storage is READ ONLY." + 
           "\nInsert an SD card that is not protected." 
       ); 
      } 
      case Environment.MEDIA_UNKNOWN : { 
       errorlist.add(
         "External Storage state is UNKNOWN." + 
           "\ntry a different SD Card." 
       ); 
      } 
      case Environment.MEDIA_UNMOUNTABLE : { 
       errorlist.add(
         "External Storage cannot be mounted." + 
           "\nTry re-inserting the SD Card or using a different SD Card." 
       ); 
      } 
      case Environment.MEDIA_UNMOUNTED : { 
       errorlist.add(
         "External Storage is not mounted." + 
           "\nTry re-inserting the SD Card or using a different SD Card." 
       ); 

      } 
      default: { 
       errorlist.add(
         "Undefined Error" 
       ); 
      } 
     } 
     this.errorcode = UNMOUNTED; 
     return; 
    } else { 
     this.mounted = true; 
    } 

    // Get the require directory and specified sub directory 
    File dir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),subdirectory); 
    this.directory = dir.getPath(); 

含まれていないコードを抽出して参照することがあります。例えば<:名=「android.permission.WRITE_EXTERNAL_STORAGE」/使用許可 アンドロイド> `許可busyがprogressdialogで、directoryチェックルーチンが

関連する問題