Android Studio无法加载数据库

时间:2018-11-22 21:04:48

标签: android postgresql

我在将PostgreSQL数据库加载到Android应用程序时遇到问题。 我已经使用“ SQLite的数据库浏览器”预定义了数据库,并将其移动到了Android项目中的assets / databases文件夹中。 当我在手机上安装该应用程序时,该数据库已存在(尽管它是空数据库,但已在Android Studio中使用“视图/工具Windows /设备文件资源管理器”进行了检查。如果我正确阅读,则getReadableDatabasegetWriteableDatabase可能创建空数据库,而不是在某些情况下使用提供的数据库,我不确定为什么在我的情况下这样做。

任何建议都值得赞赏,这是我在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个单词,那么我将需要一个月的时间为其编写所有插入内容。

1 个答案:

答案 0 :(得分:0)

由于我设法找到了问题的根源和解决方案,所以我决定将其发布在这里,以备将来参考。

我已经创建了数据库文件(file.db)并将其放在我的Android Studio项目中(我创建了assets文件夹,在其中创建了另一个databases文件夹,这就是我将文件复制到的位置)。解决此问题的解决方案是将file.db上移一个级别并将其直接放在assets文件夹中。

正如之前所指出的,硬编码路径不是最佳技术,我不鼓励这样做。我上面的代码并不完美,但是,如果您遇到类似的问题,这就是解决问题的方法。