7

.db ファイルがあり、Android アプリケーションの最初の実行時にセットアップしたいと考えています。OrmLite を使用してデータベースを管理しています。

その .db ファイルには約 7000 のレコードがあり、一般的な方法 (foreach - create コマンドを使用) でインポートする場合、インポートに時間がかかります (約 2-3 分)。

どうすればこの問題を解決できますか?

ありがとう

4

2 に答える 2

18

「 」という名前のデータベースがprepared.dbあり、パッケージ名が「com.example.android」であるとします。これが私がすることです。

  1. 準備したデータベースが assets フォルダーの下にあることを確認してください。
  2. OrmLiteSqliteOpenHelper を拡張したクラスのコンストラクタで、データベースが存在するかどうかを確認します。
  3. データベースが存在しない場合は、資産フォルダーからデータベースをコピーします

(ステップ 2 と 3 の両方がコンストラクター内で発生します)

これはコードサンプルであり、私にとってはうまくいきます。

public class DatabaseHelper extends OrmLiteSqliteOpenHelper {

    private static final String DATABASE_NAME = "prepared.db";
    private static final String DATABASE_PATH = "/data/data/com.example.android/databases/";


    public DatabaseHelper(Context context) {
        super(context, DATABASE_PATH+DATABASE_NAME, null, DATABASE_VERSION);

        boolean dbexist = checkdatabase();
        if (!dbexist) {

            // If database did not exist, try copying existing database from assets folder.
            try {
                File dir = new File(DATABASE_PATH);
                dir.mkdirs();
                InputStream myinput = mContext.getAssets().open(DATABASE_NAME);
                String outfilename = DATABASE_PATH + DATABASE_NAME;
                Log.i(DatabaseHelper.class.getName(), "DB Path : " + outfilename);
                OutputStream myoutput = new FileOutputStream(outfilename);
                byte[] buffer = new byte[1024];
                int length;
                while ((length = myinput.read(buffer)) > 0) {
                    myoutput.write(buffer, 0, length);
                }
                myoutput.flush();
                myoutput.close();
                myinput.close();            
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /*
    * Check whether or not database exist
    */
    private boolean checkdatabase() {
        boolean checkdb = false;

        String myPath = DATABASE_PATH + DATABASE_NAME;
        File dbfile = new File(myPath);
        checkdb = dbfile.exists();

        Log.i(DatabaseHelper.class.getName(), "DB Exist : " + checkdb);

        return checkdb;
    }
}

PS : データベース ファイルのサイズが 1 MB を超えると、エラーが発生します。このような問題を解決するために、データベースを分割できます。

于 2013-11-22T10:56:10.740 に答える