【问题标题】:Attaching a database file in asset folder to my own SQLite database in Android将资产文件夹中的数据库文件附加到我自己在 Android 中的 SQLite 数据库
【发布时间】:2014-05-09 12:38:37
【问题描述】:

我正在制作一个应用程序,它需要在应用程序启动时初始化大量数据,所以我想用资产文件夹中的 apk 文件导出初始数据库。我可以将该数据库复制到我的工作目录,但是当我尝试向该数据库写入/更新任何内容时,问题就出现了。

我不知道为什么它说它不可写。我知道资产中的数据库不能被重写。所以现在我想将数据库与我内部创建的数据库(通过代码编写)连接起来,这样我就可以一次性复制带有数据的表。我没有得到任何代码帮助。

【问题讨论】:

    标签: android database sqlite android-assets


    【解决方案1】:

    可以按照此代码进行操作,可能会对您有所帮助:

    public class PrepopulatedDBOpenHelper extends SQLiteOpenHelper {
        public static final String DB_NAME = "task_management";
        public static String DB_PATH;
        private SQLiteDatabase database;
        private Context context;
    
        public static final String EMPLOYEE_TABLE = "employee";
        public static final String ID_FIELD = "_id";
        public static final String NAME_FIELD = "name";
        public static final String EMAIL_FIELD = "email";
        public static final String PHONE_FIELD = "phone";
        public static final String DESIGNATION_FIELD = "designation";
    
        public PrepopulatedDBOpenHelper(Context context) {
            super(context, DB_NAME, null, 1);
            this.context = context;
    
            // database path /data/data/pkg-name/databases/
            String packageName = context.getPackageName();
            DB_PATH = "/data/data/" + packageName + "/databases/";
            this.database = openDatabase();
    
        }
    
        public SQLiteDatabase getDatabase() {
            return this.database;
        }
    
        public SQLiteDatabase openDatabase() {
            String path = DB_PATH + DB_NAME;
            if (database == null) {
                createDatabase();
                database = SQLiteDatabase.openDatabase(path, null,
                        SQLiteDatabase.OPEN_READWRITE);
            }
            return database;
        }
    
        private void createDatabase() {
            boolean dbExists = checkDB();
            if (!dbExists) {
                this.getReadableDatabase();
                Log.e(getClass().getName(),
                        "Database doesn't exist. Copying database from assets...");
                copyDatabase();
            } else {
                Log.e(getClass().getName(), "Database already exists");
            }
        }
    
        private void copyDatabase() {
            try {
                InputStream dbInputStream = context.getAssets().open(DB_NAME);
                String path = DB_PATH + DB_NAME;
                OutputStream dbOutputStream = new FileOutputStream(path);
                byte[] buffer = new byte[4096];
                int readCount = 0;
                while ((readCount = dbInputStream.read(buffer)) > 0) {
                    dbOutputStream.write(buffer, 0, readCount);
                }
    
                dbInputStream.close();
                dbOutputStream.close();
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
        private boolean checkDB() {
            String path = DB_PATH + DB_NAME;
            File file = new File(path);
            if (file.exists()) {
                Log.e(getClass().getName(), "Database already exists");
                return true;
            }
            Log.e(getClass().getName(), "Database does not exists");
            return false;
        }
    
        public synchronized void close() {
            if (this.database != null) {
                this.database.close();
            }
        }
       }
    

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      database = SQLiteDatabase.openDatabase(path, null,
                      SQLiteDatabase.OPEN_READWRITE);
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 2014-01-02
      相关资源
      最近更新 更多