SQLiteOpenHelper问题

时间:2015-06-18 07:51:39

标签: android sqlite sqliteopenhelper

我一直在使用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。{/ p>中的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方法。如果它们每次运行都会存储数据,因为当我们关闭数据库时我们会松开数据库??

1 个答案:

答案 0 :(得分:3)

  

现在的问题是,在我的游标cursorCategory中,我得到了存储在我的数据库的Category表中的数据。但是我没有在cursorTransaction中获得任何数据,为什么会这样呢?

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

  

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

     

...

     

但为什么会这样呢?

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

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

  

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

传递null会创建一个新的内存数据库。它表示一个新的空数据库,不会持久保存到磁盘。数据库关闭后,数据消失了。如果您创建另一个内存数据库,它将不会在其他内存数据库中看到数据。

  

但它在这里有效但在另一种情况下却没有。

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

  

此外,默认情况下创建的数据库的名称是什么?

无。内存数据库没有名称。命名数据库以您给出的名称存储在磁盘上。