Res/rawリソースディレクトリに保存されているcsvファイルを取得し、それを使用してsqlite3データベースのテーブルにデータを入力することはできますか?
私の考えは、ファイル全体をテーブルに一括インポートする方法があれば、ファイルの各行を繰り返して個々の挿入ステートメントを実行するよりもクリーンで高速だと思いました...
これを可能にするsqlite importコマンドがあることを発見しました: 。sqlまたは.csvファイルをSQLiteにインポートしてロードするには?
...しかし、Androidアプリケーションでこれらのステートメントを適用するのに問題があります。私の最初の考えは、次のようなものを試すことでした...しかし運がありません:
db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY, name TEXT)");
db.execSQL(".mode csv");
db.execSQL(".import res/raw/MyFile.csv " + TABLE_NAME);
これは可能ですか?
データベースにデータを入力するために別のアプローチを試すべきですか?
更新:Josefの応答を回答としてマークします(トランザクションを使用した一括挿入)。これはうまく機能し、私のタイトルに基づいて私の質問に直接回答します(Josefに感謝します)。ただし、Android appでcsvファイルからsqlite3テーブルにimportステートメントを使用して一括挿入する方法を探しています。これを行う方法がわかっている場合は、返信してください。
回答ありがとうございます!
アプリケーションに静的データをパッケージ化する場合は、開発時にデータベースを準備し(任意のUIまたはcsv-importコマンドを使用して)、sqliteファイルをアセットフォルダー内に配布することをお勧めします。その後、アプリケーションが最初に実行されたときに、sqliteファイル全体をデバイスに単にコピーできます。 Theseposts データベースをセットアップする最も速い方法(ファイルコピー速度)である可能性が高いこのアイデアを紹介します。
何らかの理由で実行時に大量のデータを挿入する必要がある場合は、高速化するために トランザクションを使用した一括挿入 の方法を検討することをお勧めします。
私は簡単な解決策を探すために多くの時間を費やし、この少しのコードを自分で思いつきました。私のようにこれを探している将来の人々のために、あなたはこれを使うことができます:
_BufferedReader in = new BufferedReader(your csv file source here);
String reader = "";
while ((reader = in.readLine()) != null){
String[] RowData = reader.split(",");
date = RowData[0];
value = RowData[1];
ContentValues values = new ContentValues();
values.put(CsvProvider.DATE, date);
values.put(CsvProvider.VALUE, value);
getContentResolver().insert(CsvProvider.CONTENT_URI, values);
}
in.close();
_
私のCSV
ファイルにはタイトルがなく、2列しかありませんが、2列を超えても問題ありません。列を分割するものを指定し、各列に別の_RowData[#]
_を追加することを忘れないでください(0から始める必要があります)。 in.close()
を呼び出す前に、各行で行うことはすべて完了していることを確認する必要があります。私はコンテンツプロバイダーを使用していますが、_String[]
_などにデータを追加するなど、データを自由に使用できます。
私が入力ストリームを使用している間、BufferedReaderをどこにでもポイントできます。 BufferedReader
がそれを読み取ることができる限り、機能します。