3

重複の可能性:
Androidアプリケーションで既存のデータベースを使用する方法

sqliteデータベースファイルがあり、アプリで使用したいと思います。

どうすればいいのですか ?

dbファイルをエミュレーターにプッシュしてからコードで使用するにはどうすればよいですか?

どんな解決策も歓迎します。事前にt​​hx、トム。

4

2 に答える 2

3
public class AssetDatabaseHelper extends SQLiteOpenHelper {

    private String dbName;
    private String db_path;
    private Context context;

    /**
     * A helper class to import db files.
     * 
     * @param base
     *            /app context
     * @param dbName
     *            The name of the db in asset folder .
     */
    public AssetDatabaseHelper(Context context, String dbName) {
        super(context, dbName, null, 1);
        this.dbName = dbName;
        this.context = context;
        db_path = "/data/data/" + context.getPackageName() + "/databases/";
    }

    /**
     * Check if the database already exist to avoid re-copying the file each
     * time you open the application.
     * 
     * @return true if it exists, false if it doesn't
     */
    public boolean checkExist() {

        SQLiteDatabase checkDB = null;

        try {
            String myPath = db_path + dbName;
            checkDB = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READONLY);

        } catch (SQLiteException e) {
            e.printStackTrace();
            // database does't exist yet.

        } catch (Exception ep) {
            ep.printStackTrace();
        }

        if (checkDB != null) {

            checkDB.close();

        }

        return checkDB != null ? true : false;
    }

    /**
     * Creates a empty database on the system and rewrites it with your own
     * database.
     * */
    public void importIfNotExist() throws IOException {

        boolean dbExist = checkExist();

        if (dbExist) {
            // do nothing - database already exist
        } else {

            // By calling this method and empty database will be created into
            // the default system path
            // of your application so we are gonna be able to overwrite that
            // database with our database.
            this.getReadableDatabase();

            try {

                copyDatabase();

            } catch (IOException e) {

                throw new Error("Error copying database");

            }
        }

    }

    private void copyDatabase() throws IOException {
        InputStream is = context.getAssets().open(dbName);

        OutputStream os = new FileOutputStream(db_path + dbName);

        byte[] buffer = new byte[4096];
        int length;
        while ((length = is.read(buffer)) > 0) {
            os.write(buffer, 0, length);
        }
        os.flush();
        os.close();
        is.close();
        this.close();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }

}

このチュートリアルに基づいています。sqliteデータベースファイルをアセットフォルダーに配置すると、コードを実行するとコピーされます。私のバージョンでは、パスを選択するため、データベースファイルを乗算できます。それを使用するには:

AssetDatabaseHelper dbHelper = new AssetDatabaseHelper(
                getBaseContext(), SomeDataBase.SOME_DATABASE_NAME);
        try {
            dbHelper.importIfNotExist();
        } catch (IOException e) {
            e.printStackTrace();
        }
于 2013-01-26T22:10:54.660 に答える
1

SQLiteOpenHelperDBテーブルに一致するように拡張する必要があります。これにより、アプリがDBと対話できるようになります。これを確認してください:http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html

/data/data/your.package/databases/DBを使用するには、エミュレーターの実行中にEclipseのAndroid->FileExplorerビューを使用するようにDBをプッシュします。

于 2013-01-26T22:01:51.793 に答える