0

I have an sqback file respresenting an sqlite db file. I want to extract the data from this sqback file, ie, table names and contents, and convert it into csv file format. I want to do this using Java.

** The sqback file will have already been uploaded from android device to pc prior to processing. So I need a solution that is appropriate for taking place server side.

Does anyone have any leads on how to perform such a task?

4

2 に答える 2

1

Android を使用している場合は、構築済みの SQLiteDatabase と SQLiteOpenHelper を利用できます。必要な情報はすべてここにあります。

すべてを解析した後、 Fileを使用して、必要な方法で CSV にエクスポートできます。

EDIT: So basically what you need to do is to parse the bytes by reading them and that way have access to the content. In some cases you don't even need to convert them to a String, since could be that you only need the value of the byte. (ie.: Offset: 44 Length:4 Description:The schema format number. Supported schema formats are 1, 2, 3, and 4.). You can always check if your values are correct with any HEX editor, even opening the sqlite file with a text editor of any kind would help.

Let's start from scratch. First, reading the file. Two approaches

  • a. Read the whole file and parse it after
  • b. Read and parse the whole file in blocks (recommended, specially for bigger files)

Both approaches would share most of the following code:

File file = new File("YOUR FILE ROUTE");
int len = 1024 * 512; //512KB

try {
    fis = new FileInputStream(file);
} catch (FileNotFoundException e1) {
    fis = null;
    e1.printStackTrace();
}
byte[] b = new byte[len];
int bread;

try {

    while((bread = fis.read(b, 0, len))!=-1)
    {
        if(parseBlock(b, bread)==1)
            return;
}

    fis.close();

} catch (IOException e) {
    e.printStackTrace();
}

違いは、部分的なブロックを取得してオンザフライで解析すること (これはうまくいくと思います) と、全体を取得することは次のようにすることです。

fis.read(b, 0, fis.available);

while ループの代わりに。

最終的にあなたのアプローチは正しいです。それがバイトを文字列に入れる方法です。(新しい文字列(b))。さらに、最初の文字は奇妙な記号を表している可能性が高く、SQL のファイル形式を見ると、これらはメタデータを格納するために予約されているバイトです。任意のテキスト エディタで sqlite ファイルを開き、そこに表示される内容がコードから得られる内容と一致することを確認します。

于 2012-08-31T17:44:45.903 に答える
1

この Web サイトでは、使用する追加ライブラリを示し、sqlite ファイルと対話する方法の例を提供しています (http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC#Usage)

注意すべき重要事項:

1) 必ず、現在のクラス ローダーを使用して sqlite-JDBC ドライバーをロードします。これは行で行われます

2) sqlite ファイルは、サーバーのどこかに置かれていない場合でも、データベースです。そのため、ファイルとやり取りするには、ファイルへの接続を作成する必要があります。また、接続を開き、接続も閉じる必要があります。 Connection connection = null; connection = DriverManager.getConnection("jdbc:sqlite:" + path); // path is a String to the sqlite file (sqlite or sqback) connection.close(); // after you are done with the file

3) SQL コードを使用してファイルをクエリすることにより、情報を抽出できます。これは、クエリに関連するデータを保持するタイプ ResultSet の処理可能なオブジェクトを返します

  Statement statement = connection.createStatement();
  statement.setQueryTimeout(30);
  ResultSet rs = statement.executeQuery("SELECT * FROM " + tblName); 

4) ResultsSet から、列インデックスまたは列ヘッダー キーのいずれかで get コマンドを使用してデータを取得できます。 rs.getString("qo")

私が抱えていたのと同じ問題を抱えている人の助けになることを願っています

于 2012-10-01T17:47:41.620 に答える