【问题标题】: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);