問題の原因: Android 上の SQLite データベースは一般にスタンドアロンです。アプリケーションのデータベースに大量のデータがある場合、マシンを変更するたびにデータベース内のすべてのデータを再構成するのは明らかに時間の無駄です。したがって、最善の方法は既存のデータベースにアクセスすることです。
解決策:
解決策 1 : Eclipse での操作はシミュレータでの使用に限定されます。
ステップ:
- Eclipseでエクスプローラービューを開く エクスプローラーはデバイス内のファイルを閲覧するためのツールで、開き方はEclipseの[ウィンドウ]-[ビューの表示]-[その他]-[エクスプローラー]の操作で行います。
- インポートするファイルの場所を見つけます。これは、database/data/data/<パッケージ名>/database ディレクトリのデフォルトの場所です。
- ディレクトリを選択し、右上隅のデバイス アイコン [デバイスからファイルをプル] をクリックし、アップロードするデータベースを選択します。
回路図は以下の通りです:
オプション 2 : データベースを res/raw ディレクトリに配置し、初めてデータベースにアクセスするときに、それを /data/data/<パッケージ名>/database ディレクトリにコピーします。これはシミュレータと実マシンの両方に適用されます。
コピーしたコードは次のとおりです。
try {
String filePath = context.getCacheDir().getAbsolutePath();
String DATABASE_PATH = filePath.substring(0, filePath.length() - 5)
+ "databases";
String DATABASE_FILENAME = "usmartscada.db";
String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
File dir = new File(DATABASE_PATH);
if (!dir.exists()) {
dir.mkdir();
}
if (!(new File(databaseFilename)).exists()) {
InputStream is = context.getResources().openRawResource(R.raw.usmartscada);;
FileOutputStream fos = new FileOutputStream(databaseFilename);
byte[] buffer = new byte[8192];
int count = 0;
// 开始复制文件
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
上記のコード例のデータベースの名前は usmartscada.db です。これは、コピーされたデータベースが正常に読み書きできることを証明しています。読み書きの権限が不足しているという問題はありません。ただし、上記にはいくつかの問題があります。コードです。
既存のデータベース ファイルを res/raw フォルダーに配置する必要があるのはなぜですか? 他の場所に配置できますか?
res/raw フォルダーに置くと、apk をパッケージ化するときにデータベース ファイルを決定する必要があり変更できません、そうでないと毎回再コンパイルして apk を生成する必要があり、使用する際に非常に面倒になるため、データベース ファイルを SD カードのどこかに置くのが最善です。検証後、データベース ファイルは SD カード上の特定の場所など、他の場所に配置できることがわかりました。どこに配置するかについては、特定の状況によって異なります。上記のコードは単なる例です。もちろん、ファイルにアクセスする場所も異なりますし、時間の経過も異なります。もちろん、SD カードにアクセスする場合は、AndroidManifest.xml ファイルに SD カードへのアクセス許可を追加する必要があることに注意してください。
- 上記のコードは、既存のデータベース ファイルが存在するかどうかを判断しません。1 つはコードを厳密にするためであり、もう 1 つは、既存のデータベースが特別なマシンには必要ない可能性があるためです。データベースを自分で構成して生成する必要があるためです。この場合、以前のデータベース。
この質問は、既存のデータベース ファイルが存在するかどうかを判断する必要があるかどうかを判断する実際の状況に依存します。判断は、データベース ファイルが配置されている場所によって異なります。 res/raw フォルダー内のファイルへのアクセスに使用されるメソッドは R.raw.xxx であるため、ファイルが存在しない場合は、データベース ファイルのオブジェクトを取得する方法がありません。 res/raw フォルダ内のファイルについての知識を追加します 絶対パスは "android.resource://" + getPackageName() + R.raw.xxx です。