【问题标题】:SQLiteOpenHelper problemsSQLiteOpenHelper 问题
【发布时间】:2015-06-18 07:51:38
【问题描述】:

我一直在使用 Android 和 SQLite 数据库开发应用程序。 但我有一些问题。 这是我的代码:

        SQLiteHelperMoney SQLiteHelperMoney1 = new SQLiteHelperMoney(this, null, null, 1);
        SQLiteDatabase database = SQLiteHelperMoney1.getReadableDatabase();
        Cursor cursorCategory = database.query(false, "CATEGORY", null, null, null, null, null, null, null);

        SQLiteHelperMoney SQLiteHelperMoney2 = new SQLiteHelperMoney(this, null, null, 1);
        SQLiteDatabase database2 = SQLiteHelperMoney2.getReadableDatabase();
        Cursor cursorTransaction = database2.query(false, "TRANSACTIONS", null, null, null, null, null, null, "10");

现在的问题是,在我的光标cursorCategory 中,我得到了存储在数据库的Category 表中的数据。但是我在cursorTransaction中没有得到任何数据,为什么会出现这种情况??

此外,在实例化我的 SQLiteHelperMoney2 对象时,如果我将 SQLiteHelperMoney2 对象的实例化更改为:

SQLiteHelperMoney SQLiteHelperMoney2 = new SQLiteHelperMoney(this, "TRANSACTIONS", null, 1);

然后我从Transaction 表中获取数据,在我的cursorTransaction 中。

但是为什么会这样呢?根据文档,在 SQLiteOpenHelper 的构造函数中,第二个参数是数据库的名称,而不是表的名称。 那为什么在 NAME OF DATABASE 字段中给出 TABLE 的名称会给出正确答案?

此外,文档说在 SQLiteOpenHelper 的构造函数中,如果数据库已经在内存中,则可以在“NAME”字段中指定 null。我假设数据库是在应用程序本身中创建的,所以它只会在内存中,这就是我在这里将第二个参数指定为 null 的原因:

SQLiteHelperMoney SQLiteHelperMoney1 = new SQLiteHelperMoney(this, null, null, 1);

但它在这里有效,但在其他情况下无效。

另外,默认创建的数据库名称是什么?因为我没有在我的 SQLiteOpenHelper 的onCreate 函数中指定它。我可以更改我的数据库的名称吗??

编辑:

onCreate方法:

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE CATEGORY (_ID INTEGER PRIMARY KEY, NAME TEXT)");
    db.execSQL("CREATE TABLE TRANSACTIONS (_ID INTEGER PRIMARY KEY, AMOUNT INTEGER, CATEGORY TEXT, NOTE TEXT, TIME TEXT, EXPENSE INTEGER)");
    db.execSQL("CREATE TABLE BUDGET (_ID INTEGER PRIMARY KEY, AMOUNT INTEGER, TIME TEXT)");

    ContentValues cv = new ContentValues();
    cv.put("NAME", "FOOD");
    db.insert("CATEGORY", null, cv);
    cv.put("NAME", "TRAVEL");
    db.insert("CATEGORY", null, cv);
    cv.put("NAME", "INCOME");/*INCOME*/
    db.insert("CATEGORY", null, cv);
    cv.put("NAME", "TRANSPORTATION");
    db.insert("CATEGORY", null, cv);
    cv.put("NAME", "MOVIE");
    db.insert("CATEGORY", null, cv);
}

@laalto:我在这里读到了你的答案:When is SQLiteOpenHelper onCreate() / onUpgrade() run?

我对磁盘和内存数据库有点困惑。在我的onCreate 方法中,我在Category 表中添加了行,因为我相信onCreate 方法在应用程序的生命周期中只调用一次,即第一次运行时,用于创建数据库。 这就是为什么在我的onCreate 方法中我将数据添加到我的CATEGORY 表中,因为我希望它有一些初始数据。

而且我相信当我们对getReadableDatabase()getWritableDatabase() 进行替换调用时,它会返回一个早期创建的数据库的副本供我们使用,或者可能是原始数据库的句柄,并在完成时保存这些更改。但是,在阅读了您的答案之后,似乎每次都运行 onCreate 方法。如果它们每次都在数据存储的地方运行,因为当我们关闭它时我们会丢失数据库??

【问题讨论】:

    标签: android sqlite sqliteopenhelper


    【解决方案1】:

    现在的问题是,在我的光标 cursorCategory 中,我得到了存储在数据库的 Category 表中的数据。但是我在 cursorTransaction 中没有得到任何数据,为什么会出现这种情况??

    查询不会从您刚刚创建的内存数据库中返回任何数据。

    此外,在实例化我的 SQLiteHelperMoney2 对象时,如果我将 SQLiteHelperMoney2 对象的实例化更改为:

    ...

    但是为什么会这样呢??

    该查询从先前创建的磁盘数据库中返回一些数据。

    出于某种巧合,数据库文件的名称与表的名称相同。卸载并重新安装您的应用,或在应用管理器中清除其数据以删除可能仍然存在的旧数据库文件。

    此外,文档说在 SQLiteOpenHelper 的构造函数中,如果数据库已经在内存中,则可以在字段“NAME”中指定 null。我假设数据库是在应用程序本身中创建的,所以它只会在内存中

    传递一个空值会创建一个新的内存数据库。这意味着一个没有持久化到磁盘的新的空数据库。当数据库关闭时,数据就消失了。如果您创建另一个内存数据库,它不会看到其他内存数据库中的数据。

    但它在这里有效,但在其他情况下无效。

    可能是因为另一个助手在其onCreate() 中填充了数据库,而另一个没有。

    另外,默认创建的数据库名称是什么?

    什么都没有。内存数据库没有名称。命名数据库以您提供的名称存储在磁盘上。

    【讨论】:

    • 1) 为什么查询没有从我刚刚创建的内存database2 中返回任何数据? 2)实例化我的SQLiteHelperMoney2 后,我对database2 进行第二次查询,然后如何查询先前创建的数据库?我不明白。 3)有没有可能onCreate虽然有数据,但没有填充数据库??
    • 最初我在同一个 database1 对象上进行了两个查询。但是,即便如此,我的Transactions 查询也一无所获。我不确定一个数据库是否可以用于多个查询,所以我创建了另一个实例来创建database2并在那里查询TRANSACTIONS,但仍然没有成功。
    • 卸载您的应用程序/清除其数据以摆脱可能的旧数据库文件。编辑问题以添加您的助手onCreate() 方法。
    • 我试过这样做,但还是不行。刚刚添加了代码。请检查!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 2021-09-13
    • 2011-03-31
    • 2014-06-23
    相关资源
    最近更新 更多