3

可能重复:
如何将现有数据库与 Android 应用程序一起使用

我有一个 sqlite 数据库文件,我想在我的应用程序中使用它。

我该怎么做 ?

如何将我的 db 文件推送到模拟器,然后在我的代码中使用它?

欢迎任何解决方案。提前谢谢,汤姆。

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

您需要扩展SQLiteOpenHelper以匹配您的数据库表。这将允许您的应用程序与数据库进行交互。检查这个:http: //developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html

要使用数据库,请/data/data/your.package/databases/在模拟器运行时使用 Eclipse 中的 Android->File Explorer 视图。

于 2013-01-26T22:01:51.793 回答