6

私は大学のプロジェクトの目的でスパイ アプリケーションに取り組んでいます。そのために、デバイスの通話、場所、SMS を記録し、データベースに保存しました。データベースの内容をテキストファイルにエクスポートしたい..以下のコードを試しました。

private void readAndWriteCallsData() {

    File dataBaseFile = getDatabasePath("DATABASE"); 

    File callDataFile = new File(Environment.getDataDirectory()+"/data/com.example.myapp/databases/"+"DATABASE");

    try {

        BufferedReader dbFileReader = new BufferedReader(new FileReader(callDataFile));

        String eachLine;

        while((eachLine = dbFileReader.readLine()) != null)
        {

                Callslog.append(eachLine);
                Callslog.append("\n");

        }

    } catch (IOException e) {

        e.printStackTrace();
    }


}

しかし、それは機能していません...助けてください...

4

7 に答える 7

2

データベース ファイルを Base64 でバイナリ ストリームから文字ストリームにエンコードし、必要に応じてテキストをデコードできます。

最初に Base64 ライブラリを見つけます。http://sourceforge.net/projects/iharder/files/base64/を使用できます。「Base64.java」というファイルが 1 つだけあります。

コード例:

private void readAndWriteCallsData() {
    File callDataFile = new File(Environment.getDataDirectory()+"/data/com.example.myapp/databases/"+"DATABASE");
    try {
        FileInputStream fis = new FileInputStream(callDataFile);
        try{
            byte[] buf = new byte[512];
            int len;
            while((len = fis.read(buf)) > 0){
                String text = Base64.encodeBytes(buf, 0, len); // encode binary to text
                Callslog.append(text);
                Callslog.append("\n");
            }
        }finally{
            fis.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

元に戻すには、次のようにコーディングします。

private void revertCallsData() {
    File encodedCallDataFile; // get reference to the encoded text file
    try {
        BufferedReader br = new BufferedReader(new FileReader(encodedCallDataFile));
        try{
            String line;
            while((line = br.readLine()) != null){
                byte[] bin = Base64.decode(line); // decode each line to binary, you can get the original database file
            }
        }finally{
            br.close();
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
}
于 2013-03-17T16:14:54.693 に答える
2

多くのヒットと試行錯誤の後、最終的に解決策を見つけました。コードは次のとおりです。機能をボタンに保存しました。

final String SAMPLE_DB_NAME = "MyDBName.db";//database name
save.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                    File sd = Environment.getExternalStorageDirectory();
                    File data = Environment.getDataDirectory();
                    FileChannel source=null;
                    FileChannel destination=null;
                    String currentDBPath = "/data/"+ "your package name" +"/databases/"+SAMPLE_DB_NAME;
                    String backupDBPath = SAMPLE_DB_NAME;
                    File currentDB = new File(data, currentDBPath);
                    File backupDB = new File(sd, backupDBPath);
                    try {
                        source = new FileInputStream(currentDB).getChannel();
                        destination = new FileOutputStream(backupDB).getChannel();
                        destination.transferFrom(source, 0, source.size());
                        source.close();
                        destination.close();
                        Toast.makeText(getApplicationContext(),"Your database has been exported",
                                Toast.LENGTH_LONG).show();
                    } catch(IOException e) {
                        e.printStackTrace();
                    }


            }


        });

データベースは /storage/emulated/0/ に保存されます

于 2015-01-26T12:02:04.677 に答える
1

データベース全体を sdcard フォルダーにエクスポートし、SQLite マネージャーを使用してコンテンツを開いて確認できます。

例はここにあります: http://www.techrepublic.com/blog/software-engineer/export-sqlite-data-from-your-android-device/

于 2015-01-30T05:42:23.313 に答える
0

以下は、SD カードにデータベースを書き込むための完全な方法です。

/** 
     * Copy the app db file into the sd card
     */
    private void backupDatabase(Context context) throws IOException {
        //Open your local db as the input stream
        String inFileName = "/data/data/yourappPackageName/databases/yourDBName.db";
// OR use- context.getFilesDir().getPath()+"/databases/yourDBName.db";//
        File dbFile = new File(inFileName);
        FileInputStream fis = new FileInputStream(dbFile);

        String outFileName = Environment.getExternalStorageDirectory()+"/"+SQLiteDataHelper.DB_NAME;
        //Open the empty db as the output stream
        OutputStream output = new FileOutputStream(outFileName);
        //transfer bytes from the inputfile to the outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = fis.read(buffer))>0){
            output.write(buffer, 0, length);
        }
        //Close the streams
        output.flush();
        output.close();
        fis.close();
    }

それがあなたを助けることを願っています。

于 2015-01-28T10:49:59.260 に答える
-1

データベースを知っていて、すべてのテーブルを取得し、それらのテーブルから情報を取得する場合は、これを行う 1 つの方法 (長い手順ですが、簡単だと思います)。私たちはsqlite DBについて話しているので、それは小さいと思います。

SELECT * FROM dbname.sqlite_master WHERE type='table';
于 2013-03-17T18:15:17.943 に答える