1

重複の可能性:
AndroidでデータベースファイルをSDカードにバックアップする方法は?

私はphonegap 1.3.0に取り組んでいます。data/data/(パッケージ名)/test.db に保存されている phonegap に test.db という名前のデータベースを作成しました。データベースをsdcard(mnt/sdcard)にコピーするために、ネイティブのAndroidコードを使用しています。しかし、test.dbが存在しないというエラーが発生しています。デバイスがルート化されていません。私は何が欠けていますか?

前もって感謝します。

コードは次のとおりです->

public void copyfile(String srFile, String dtFile) throws FileNotFoundException{
    String DBPATH = "/data/data/package_name/databases/";
     String DBNAME = "test.db";
     String myPath = DBPATH + DBNAME;

    //Open your local db as the input stream
    File externalStorage = Environment.getExternalStorageDirectory();

    InputStream myInput = new FileInputStream(myPath);

    // Path to the just created empty db
    String outFileName = "/mnt/sdcard/folder/test.db";

    //Open the empty db as the output stream
    OutputStream myOutput;
    try {
    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();
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
}

phonegap コードは次のとおりです。

<!DOCTYPE html>

<script type="text/javascript" charset="utf-8" src="phonegap-1.3.0.js"></script>


 <script type="text/javascript" charset="utf-8">
 db = window.openDatabase("test", "1.0", "PhoneGap Demo", 200000);
function createDB() {
    db.transaction(populateDB);
}
function populateDB(tx) {
    Field17=document.form.Field17.value;
    Field18=document.form.Field18.value;
    Field19=document.form.Field19.value;
    //tx.executeSql('DROP TABLE IF EXISTS INFO');
    tx.executeSql('CREATE TABLE IF NOT EXISTS INFO (pid integer primary key, field17,field18,field19');
    sql = "INSERT INTO INFO (field17,field18,field19) VALUES ( '" + Field17 + "','" + Field18 + "','" + Field19 + "')";
    tx.executeSql(sql);
    db.transaction(queryDB);
}


function queryDB(tx,results) {
    console.log("inside querydb");
    tx.executeSql('SELECT * FROM INFO', [], querySuccess);
}

function querySuccess(tx, results) {     
var len = results.rows.length;
    alert('rows inserted: ' + len);
    if (len > 0) {
        for (var i=0;i<len;i++) {

            console.log('pid: ' + results.rows.item(i).pid + 'field: ' + results.rows.item(i).field17 + ' field: ' + results.rows.item(i).field18+ ' field ' + results.rows.item(i).field19);

        }
    }
}       


</script>
4

2 に答える 2

1

電話をルート化する必要はありません。権限を確認してください <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

ファイルを確認できます

File dbFile = new File(DB_PATH + DB_NAME);
        if(dbFile.exists()){
                  //Continue

編集:このコードをテストしてください。パッケージ名とsdcardのあなたのFolerを変更します

public boolean checkDataBase() {
    File dbFile = new File(DB_PATH + DB_NAME);
    return dbFile.exists();
}

public void copyfile(String srFile, String dtFile) throws FileNotFoundException{
    private static String DB_NAME = "dictionary.db";
    private static String DB_PATH = "/data/data/com.app.android.dictionary/databases/";
if(checkDataBase()){
InputStream myInput = new FileInputStream(DB_PATH + DB_NAME);

    // Path to the just created empty db
    String outFileName = Environment.getExternalStorageDirectory().getAbsolutePath() + "/foler/" + DB_NAME;

    //Open the empty db as the output stream
    OutputStream myOutput;
    try {
    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();
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

}
}
于 2012-04-05T09:41:57.447 に答える
0

アプリケーションはデータベースを作成しません。実際には Android システムによって作成され、データベースのファイル権限は-rw-rw----です。これは、 User と group のみがアクセスできることを意味し、この場合は両方がsystemです。そのため、プログラムにはアクセスする権利がないため、「許可が拒否されました」というエラーが発生しました。

于 2012-04-04T10:02:27.110 に答える