【问题标题】:Reading from a pre-populated database file for android从预填充的 android 数据库文件中读取
【发布时间】:2011-08-02 09:44:39
【问题描述】:

我在page 上学习了本教程。我彻底遵循了它,但我仍然无法让预填充的数据库文件工作。我不断收到错误消息,说 .getReadableDatabase 或 .getWritableDatabase 被递归调用。还尝试了这个page 的答案的解决方案,但它也不起作用。有没有更简单的方法可以将预填充的数据库复制到本地数据库,从而使我能够更新和创建数据?

【问题讨论】:

标签: android database sqlite


【解决方案1】:

试试这个:

public class DatabaseManager {
private DatabaseHelper dataHelper;
private SQLiteDatabase mDb;
private Context ctx;
private String DATABASE_PATH = "/data/data/Your_Package_Name/databases/";
private static String DATABASE_NAME = "Your_Database";
private static String TABLE_NAME = "Your_Table";
private static final int DATABASE_VERSION = 1;
String Class_Tag = "DatabaseManager";

public DatabaseManager(Context ctx) {
    this.ctx = ctx;
    dataHelper = new DatabaseHelper(ctx);
}

private static class DatabaseHelper extends SQLiteOpenHelper {
    @SuppressWarnings("unused")
    Context myContext = null;

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.myContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w("DBHelper", "Upgrading database from version " + oldVersion
                + " to " + newVersion + ", which will destroy all old data");
        onCreate(db);
    }
}

public boolean checkDataBase() {

    File f = null;
    try {
        String myPath = DATABASE_PATH + DATABASE_NAME;
        f = new File(myPath);
    } catch (Exception e) {
        Log.e(Class_Tag, "checkDataBase()", e);
    }
    return f.exists();
}

public void createDataBase() {

    try {
        openDB();
        InputStream myInput = ctx.getAssets().open(DATABASE_NAME + ".db");
        OutputStream myOutput = new FileOutputStream(DATABASE_PATH
                + DATABASE_NAME);

        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }

        if (mDb.isOpen())
            mDb.close();
        myOutput.flush();
        myOutput.close();
        myInput.close();

    } catch (Exception e) {
        Log.e(Class_Tag, "createDataBase()", e);
    }
}

public DatabaseManager openDB() throws SQLException {

    mDb = dataHelper.getWritableDatabase();
    return this;
}
public void closeDB() {
    try {
        if (mDb != null) {
            mDb.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

在 MainActivity 中

DatabaseManager dbMgr=new DatabaseManager(this);
try {
    if (!dbMgr.checkDataBase()) {
                dbMgr.createDataBase();
            }
        } catch (Exception e) {
            Log.e(Class_Tag, "onCreate()", e);
        } finally {
            dbMgr.closeDB();
        }

希望对你有帮助...

【讨论】:

    猜你喜欢
    • 2019-05-05
    • 2011-02-22
    • 2021-01-26
    • 1970-01-01
    • 2018-06-27
    • 2016-07-09
    • 2013-09-16
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多