简体   繁体   English

我的开发者应用程序在 Android 9 上打开数据库时出现问题

[英]My developer app problem with opening database on Android 9

Can you help my?你能帮我吗?

I have created and published the app on Google play store that contains a database, I have tested it on different android phones.我已经在包含数据库的 Google Play 商店上创建并发布了该应用程序,我已经在不同的 android 手机上对其进行了测试。 My app works perfect on android version (Android 10,8,5 etc...) except on Android 9, do you know how can I fix that problem?我的应用程序在 android 版本(Android 10,8,5 等...)上完美运行,除了在 Android 9 上,你知道我该如何解决这个问题吗? I find that problem on Huawei Smart Z, Honor P20, Samsung Y6,Xiaomi Mi.我在华为 Smart Z、荣耀 P20、三星 Y6、小米米上发现了这个问题。 Play store console says that my app can run on that models. Play 商店控制台说我的应用程序可以在该模型上运行。 I am beginner in app development.我是应用程序开发的初学者。

This happening on mine Huawei Smart: when I install the app it opens and crashes when I want to enter in database, and when I want to enter in app again it crashes and on logcat:这发生在我的Huawei Smart上:当我安装应用程序时,当我想进入数据库时它会打开并崩溃,当我想再次进入应用程序时它会崩溃并在logcat上:

E/Path 1: data/data/com.gema/databases/ 
E/SQLiteLog: (14) cannot open file at line 36906 of [c255889bd9]
E/SQLiteLog: (14) os_unix.c:36906: (2) open(//data/data/com.gematranslate/databases/gema_recnik.db) - 
E/SQLiteDatabase: Failed to open database 'data/data/com.gematranslate/databases/gema_recnik.db'.
android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (Sqlite code 14 SQLITE_CANTOPEN): Could not open database, (OS error - 2:No such file or directory)

In android manifest I put:在 android 清单中,我放了:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

This is my code for check db:这是我检查数据库的代码:

public boolean checkDataBase() {
    SQLiteDatabase checkDB = null;
    try {
        String myPath = DB_PATH + DB_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READONLY);
        myContext.getDatabasePath(DB_NAME).getPath();
        checkDB.disableWriteAheadLogging();
    } catch (SQLException e)
    {
        //
    }
    if (checkDB!= null){
        checkDB.close();
    }
    return checkDB != null? true : false;

This is my code for opening db:这是我打开数据库的代码:

public void openDataBase() {
    String myPath = DB_PATH + DB_NAME;
    myContext.getDatabasePath(DB_NAME).getPath();
    db = SQLiteDatabase.openDatabase(myPath,null, SQLiteDatabase.OPEN_READWRITE);
    db.disableWriteAheadLogging();

If anyone can help me, thanks a lot.如果有人可以帮助我,非常感谢。

This is a solution that is supported on all versions of Android这是所有版本的 Android 都支持的解决方案

public class DataBase extends SQLiteOpenHelper {

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "database.db";
private static String DATABASE_PATH = "";
private static String LAST_DATABASE_PATH = "";
private SQLiteDatabase mDataBase;
private final Context ctx;

public DataBase2(@Nullable Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    DATABASE_PATH = context.getDatabasePath(DATABASE_NAME).getPath();
    this.ctx = context;

    if (!checkIfDBExists()) {
        createDataBase();
    }

    File dbFile = new File(Environment.getDataDirectory().getPath()+"/data/"+ BuildConfig.APPLICATION_ID +"/databases");
    if (dbFile.isDirectory()) {
        String[] child = dbFile.list();
        assert child != null;
        for (int i = 0; i < child.length; i++) {
            if (!(child[i].equals("database.db") || child[i].equals(DATABASE_NAME))) {
                new File(dbFile, child[i]).delete();
            }
        }
    }
}

public void createDataBase() {
    this.getReadableDatabase();
    this.close();
    try {
        copyDataBase();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    try {
        File DbFile = ctx.getDatabasePath(DATABASE_NAME);
        if (DbFile.exists()) {
            copyDataBase();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private boolean checkIfDBExists() {
    File dbFile = new File(DATABASE_PATH);
    return dbFile.exists();
}



public void openDataBase() {
    close();
    mDataBase = SQLiteDatabase.openDatabase(DATABASE_PATH, null, CREATE_IF_NECESSARY);
}

private void copyDataBase() throws IOException {
    InputStream mInput = ctx.getAssets().open("database.db");
    String outfileName = DATABASE_PATH;
    OutputStream mOutput = new FileOutputStream(outfileName);
    byte[] buffer = new byte[1024];
    int mLength;
    while ((mLength = mInput.read(buffer)) > 0) {
        mOutput.write(buffer, 0, mLength);
    }
    mOutput.flush();
    mInput.close();
    mOutput.close();
}

@Override
public void onCreate(SQLiteDatabase db) {
}


@Override
public synchronized void close() {
    if (mDataBase != null)
        mDataBase.close();

    SQLiteDatabase.releaseMemory();
    super.close();
}

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM