6

我想preloaded database在我的应用程序中使用意味着在安装 apk 时尝试获取数据库,以便可以使用已经保存在其中的数据。我将“ingredients.db” 文件复制到资产文件夹中。并使用以下代码,但这会得到错误“从资源文件复制数据库时出现问题”

我怎么解决这个问题?请给我建议可能的方法

我的数据库助手类是这样的

class IngredientHelper extends SQLiteOpenHelper {
        private static final String DATABASE_PATH = "/data/data/com.example.preloadeddatabase/databases/";
        private static final String DATABASE_NAME = "ingredients.db";

        private static final String TABLE_NAME = "Ingredients";
        private static final String COLUMN_ID = "_id";
        private static final String COLUMN_TITLE = "ingredient_name";

        private static final int SCHEMA_VERSION = 1;

        public SQLiteDatabase dbSqlite;
        private final Context myContext;

        public IngredientHelper(Context context) {
            super(context, DATABASE_NAME, null, SCHEMA_VERSION);
            this.myContext = context;

        }

        @Override
        public void onCreate(SQLiteDatabase db) {

        }

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

        }

        public void createDatabase() {

            createDB();
        }

        public void createDB() {

            boolean dbExist = DbExists();

            if (!dbExist) {
                this.getReadableDatabase();
                copyDataBase();

            }
        }

        private boolean DbExists() {
            SQLiteDatabase db = null;
            try {
                String databasePath = DATABASE_PATH + DATABASE_NAME;
                db = SQLiteDatabase.openDatabase(databasePath, null,
                        SQLiteDatabase.OPEN_READWRITE);

                db.setLocale(Locale.getDefault());
                db.setLockingEnabled(true);
                db.setVersion(1);

            }

            catch (SQLiteException e) {
                Log.e("SqlHelper", "Database Not Found");
            }

            if (db != null) {
                db.close();
            }

            return db != null ? true : false;
        }

        private void copyDataBase() {
            InputStream iStream = null;
            OutputStream oStream = null;
            String outFilePath = DATABASE_PATH + DATABASE_NAME;
            try {
                iStream = myContext.getAssets().open(DATABASE_NAME);
                oStream = new FileOutputStream(outFilePath);
                byte[] buffer = new byte[2048];
                int length;
                while ((length = iStream.read(buffer)) > 0) {
                    oStream.write(buffer, 0, length);
                }
                oStream.flush();
                oStream.close();
                iStream.close();
            }

            catch (IOException e) {
                throw new Error("Problem Copying Database From Resource File");
            }
        }

        public void openDatabase() throws SQLException {

            String myPath = DATABASE_PATH + DATABASE_NAME;
            dbSqlite = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READWRITE);
        }

        @Override
        public synchronized void close() {

            if (dbSqlite != null) {
                dbSqlite.close();
            }
            super.close();

        }

        public Cursor getCursor() {
            SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
            queryBuilder.setTables(TABLE_NAME);
            String[] asColumnsToReturn = new String[] { COLUMN_ID, COLUMN_TITLE };

            Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn,
                    null, null, null, null, "ingredient_name ASC");

            return mCursor;
        }

        public String getName(Cursor c) {
            return (c.getString(1));
        }
4

3 回答 3

2

在将资源文件复制到数据库目录之前,不要打开可读数据库。您可能会遇到异常,因为您正在尝试写入您已经打开的文件(因为当您调用 getReadableDatabase() 时它会被打开)。

于 2011-11-26T12:58:54.403 回答
1

这是您问题的简单解决方案,但是在这种方法中存在错误。当你使用方法this.getReadableDatabase();,那么数据库是打开的,即应该关闭this.close(); 此错误对于 HTC Desire 设备尤为重要

使用这个解决方案,可以解决打开数据库的问题。

于 2012-12-20T12:23:36.040 回答
0

数据库文件必须具有扩展名“.sqlite”而不是“.db”

于 2011-11-26T12:56:01.300 回答