【问题标题】:Why are we setting factory as null?为什么我们将工厂设置为空?
【发布时间】:2019-03-12 12:44:50
【问题描述】:

那么,这段代码背后的意义何在? (我是 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);
}

【问题讨论】:

  • 可能是因为代码中不需要它。
  • 构造函数的文档告诉你关于那个工厂参数的什么? idownvotedbecau.se/noresearch
  • 我建议您查看javadoc,并在您的 IDE 中探索源代码

标签: java android sql inheritance android-sqlite


【解决方案1】:

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

SQLiteOpenHelper 是一个辅助类,也就是说,它是抽象的,因此它需要一个子类(即它必须被扩展并且不能单独使用)。此外,它要求子类覆盖 onCreateonUpgrade 方法。

我们在这里谈论的是什么背景?

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

为什么我们要为工厂传递“null”?

factory,如果不为 null,则为 CursorFactory,允许通过 SQLiteCursorDriver 光标事件进行处理(覆盖方法)。很少需要这样的覆盖,因此通常使用 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/ (因此需要作为 the_package_name 的 Context 将取决于包名称)。

  • 如果第 4 个参数(数据库版本)大于 SQLiteOpenHelper 存储在数据库中的版本号(它使用 SQLite user_version 字段,这是Database Header 的一部分)。

  • 警告如果提供的数据库版本低于数据库中的版本,除非 onDowngrade 方法被覆盖,否则应用程序将崩溃。

  • 可能还会经常看到Temporary Files Used By SQLite 中的其他文件,-journal(直到 Android Pie)或 -wal 和 -shm(来自 Android Pie)。从 Android Pie 开始,默认值已从 journal 更改为 wal(预写日志记录)。

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

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

【讨论】:

  • MikeT,您能否就 OnDowngrade 存在的原因提供一些见解?我从未发布过数据库版本降低的产品的新版本。如果有一个“撤消”要做,它将作为升级到更高版本号来完成。如果调用 OnDowngrade,我正在考虑抛出异常,因为我不明白为什么需要它。
  • @MarkLongmire 作为临时措施,您可能需要取消更改,这并不是最罕见的事件。如果调用 onDownGrade,则无需抛出异常。它已经这样做了(因此发出警告)。 如果不被覆盖,默认实现将拒绝降级并抛出 SQLiteException onDowngrade
  • 感谢@MikeT,我在发布后看到了有关默认异常的文档。
猜你喜欢
  • 2021-07-05
  • 2023-04-06
  • 2016-02-22
  • 2012-06-15
  • 1970-01-01
  • 2013-08-30
  • 2021-07-26
  • 2011-07-12
  • 1970-01-01
相关资源
最近更新 更多