为什么我们将工厂设置为null?

问题描述 投票:-2回答:1

那么,这段代码背后的意义何在? (我是Android新手中的SQL)我创建了一个新类,通过SQLiteOpenHelper类创建数据库。我们在这里讨论什么背景?为什么我们为工厂传递'null'?任何人都可以详细解释代码的彻底工作吗?谢谢。

超级语法是:super(Context,databaseName,factory,databaseVersion)

public class DBOpenHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "database.db";
private static final int DATABASE_VERSION = 1;

public DBOpenHelper(Context context) {
    super(context,DATABASE_NAME, null, DATABASE_VERSION);
}
java android sql inheritance android-sqlite
1个回答
0
投票

那么,这段代码背后的意义何在?

SQLiteOpenHelper是一个辅助类,也就是说,它是抽象的,因此它需要一个子类(即它必须被扩展,不能单独使用它)。此外,它要求子类重写onCreate和onUpgrade方法。

我们在这里讨论什么背景?

它需要一个Context,以便能够确定/提取包名称,该名称用于确定数据库文件的位置。 Context本身提供应用程序环境信息(包括包)。 Context

为什么我们为工厂传递'null'?

factory,如果不为null,则是一个CursorFactory,它允许通过SQLiteCursorDriver Cursor事件处理(覆盖方法)。很少需要这样的覆盖,因此通常使用null,因为它表明不使用工厂。

所以要纠正你的代码,至少应该是: -

public class DBOpenHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "database.db";

    private static final int DATABASE_VERSION = 1;

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

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}
  • 如果运行上述操作,则从您的角度来看,结果数据库将为空,因为尚未定义任何表。 2表实际上是存在的 SQLite表sqlite_master是数据库的模式 特别是对于Android这个名为android_metadata的表,其中包含locale
  • onCreate方法在数据库的生命周期内只运行一次,也就是说它运行数据库文件必须不存在。数据库文件名将与数据库名称完全相同(即它是文件名)。它将位于/ data / data / the_package_name / databases /(因此需要Context,因为the_package_name将取决于包名称)。
  • 如果第4个参数(数据库版本)大于SQLiteOpenHelper在数据库中存储的版本号(它使用SQLite user_version字段,即Database Header的一部分),则onUpgrade方法将运行。
  • 警告所提供的数据库版本应低于数据库版本,除非覆盖了onDowngrade方法,App将崩溃。
  • 根据Temporary Files Used By SQLite,可能还有其他文件,-journal(最多为Android Pie)OR -wal和-shm(来自Android Pie)经常会出现。从Android Pie中,默认值已从journal更改为wal(预写日志记录)。

那么,这段代码背后的意义何在? (第2部分/额外)

您不限于使用SQLiteOpenHelper。您可以使用SQliteDatabase openDatabaseSQLiteDatabase openOrCreateDatabase方法打开(连接)SQLiteDatabase。

© www.soinside.com 2019 - 2024. All rights reserved.