如何在方法中指定继承自SQLiteOpenHelper的class中创建的数据库的路径?

How to specify the path to the database created in the class inherited from SQLiteOpenHelper in the method?

有一个方法取自https://metanit.com/java/android/14.4.php:

public SQLiteDatabase open()throws SQLException {
 
    return SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READWRITE);
}

问题在于,在此示例中,数据库是在资产文件夹中显式创建的

但在我的例子中,数据库是在 class:

中创建的
public class PreparationDBHelper extends SQLiteOpenHelper {

    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "PreparationDb";
    public static final String TABLE_TEXT = "textTable";

    public static final String KEY_ID = "_id";
    public static final String KEY_NAME = "name";
    public static final String KEY_TEXT = "text";

    public PreparationDBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table " + TABLE_TEXT + "(" + KEY_ID
                + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + KEY_NAME + " text," + KEY_TEXT + " text" + ")");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists " + TABLE_TEXT);

        onCreate(db);
    }

/*    public SQLiteDatabase open()throws SQLException {

        return SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READWRITE);
    }*/
}

我的情况如何在open()方法中指定数据库路径?

How do I specify the path to the database in the open () method in my case?

您不需要 open() 方法,而且可能也不应该。您可以使用 getWritableDatabase()getReadableDatabase() 方法从 PreparationDBHelper class 的实例获取打开的 SQLiteDatabase。

  • getReabaleDatabase 在大多数情况下 return 是一个可写数据库,它不会保护数据库不被更新。

  • PreparationDBHelper extends SQliteOpenHelper 如此命名是因为它可以帮助您打开数据库。因此几乎不需要以其他方式打开数据库。

    • 请注意,在调用 get????ableDatabase 方法之一之前,数据库不会打开。
  • 如果你真的想要路径,那么在你的情况下你可以使用 your_context.getDatabasePath(DATABASE_NAME) (your_context 是一个上下文) 其中 returns 一个 File 对象,您可以从中检索字符串形式的路径,例如String myDBPath = your_context.getDatabasePath(DATABASE_NAME).getPath() (请参阅文件,因为还有 getAbsolutePathgetCanonicalPath 方法).

    • 但是,这假定数据库存储在推荐的位置(就像您的情况一样,但您可以将数据库存储在其他位置) ;或者,您可以使用 SQLiteDatabase 的(return来自 getWritableDatabasegetReadableDatabasegetPath() 方法。
  • 在您指向的示例代码中使用了 DB_PATH =context.getFilesDir().getPath() + DB_NAME;(这会将数据库放置在 data/data// 而不是推荐 data/data//databases/)。真的这个例子应该使用 DB_PATH = context.getDatabasePath(DB_NAME).getPath();

The problem is that in this example, the database is created explicitly in the assets folder.

不是,数据库从资产文件夹复制(如果数据库不存在)到它的最终位置(这不是推荐的位置)。

  • 该示例似乎没有使用推荐的数据库位置,而是绕过了处理安装应用程序时数据库文件夹不存在以及如果使用推荐的复制将失败的问题位置,除非创建了数据库目录。 所需要的只是一个额外的行 file.mkdirs().