我在将PostgreSQL数据库加载到Android应用程序时遇到问题。
我已经使用“ SQLite的数据库浏览器”预定义了数据库,并将其移动到了Android项目中的assets / databases文件夹中。
当我在手机上安装该应用程序时,该数据库已存在(尽管它是空数据库,但已在Android Studio中使用“视图/工具Windows /设备文件资源管理器”进行了检查。如果我正确阅读,则getReadableDatabase
和getWriteableDatabase
可能创建空数据库,而不是在某些情况下使用提供的数据库,我不确定为什么在我的情况下这样做。
任何建议都值得赞赏,这是我在DataBase帮助器类中拥有的代码(出现问题几天后,我决定使用一些教程,这就是我从中获取代码的地方。)
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_PATH = "/data/data/com.example.irek.flashcards/databases/";
private static final String DB_NAME = "flashCards.db";
public static final int DB_VERSION = 1;
private SQLiteDatabase db;
private final Context context;
Cursor c = null;
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
this.context = context;
}
public void createDatabase() throws IOException{
boolean dbExist = checkDatabase();
if (dbExist){
}
else {
this.getReadableDatabase();
try {
copyDatabase();
}
catch (IOException e){
throw new Error("Error copying database");
}
}
}
private boolean checkDatabase(){
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}
catch (SQLiteException sle){
// Database doesn't exists
}
if (checkDB != null){
checkDB.close();
}
return checkDB != null ? true : false;
}
private void copyDatabase() throws IOException {
// Open local db as an Input stream
InputStream input = context.getAssets().open(DB_NAME);
// Path to just created empty db
String outFileName = DB_PATH + DB_NAME;
// Open the empty db as the output stream
OutputStream output = new FileOutputStream(outFileName);
// Transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length=input.read(buffer))>0){
output.write(buffer, 0, length);
}
// Close the streams
output.flush();
output.close();
input.close();
}
public void openDatabase() throws SQLException{
String myPath = DB_PATH + DB_NAME;
db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}
public SQLiteDatabase getDb() {
return db;
}
@Override
public synchronized void close(){
if (db != null){
db.close();
}
super.close();
}
}
我想一种解决方案是在创建空数据库时将所有数据插入Android代码中,但是我认为这样做并不容易。我正在制作支持多种语言的Flash Card应用程序,至少支持五种语言-如果我为每种语言添加1000个单词,那么我将需要一个月的时间为其编写所有插入内容。
答案 0 :(得分:0)
由于我设法找到了问题的根源和解决方案,所以我决定将其发布在这里,以备将来参考。
我已经创建了数据库文件(file.db)并将其放在我的Android Studio项目中(我创建了assets
文件夹,在其中创建了另一个databases
文件夹,这就是我将文件复制到的位置)。解决此问题的解决方案是将file.db
上移一个级别并将其直接放在assets
文件夹中。
正如之前所指出的,硬编码路径不是最佳技术,我不鼓励这样做。我上面的代码并不完美,但是,如果您遇到类似的问题,这就是解决问题的方法。