微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android-SQLiteOpenHelper问题

我一直在使用Androidsqlite数据库来开发应用程序.
但是我有一些问题.
这是我的代码

        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 =新的sqliteHelperMoney(this,“ TRANSACTIONS”,null,1);

然后我从cursorTransaction中的Transaction表中获取数据.

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

此外,该文档还说,如果数据库已经在内存中,则在sqliteOpenHelper的构造函数中的“名称”字段中可以指定null.我以为数据库是在应用程序本身中创建的,因此它将仅在内存中,这就是为什么我在此处将第二个参数指定为null的原因:

sqliteHelperMoney sqliteHelperMoney1 =新的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方法中,我在我的类别表中添加了行,因为我相信onCreate方法在应用程序的生命周期内(即第一次运行时)仅被调用一次以创建数据库.
这就是为什么在我的onCreate方法中将数据添加到CATEGORY表中的原因,因为我希望它具有一些初始数据.

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

解决方法:

Now the problem is, that in my cursor cursorCategory I get the data that is stored in the Category table of my database. But I do not get any data in the cursorTransaction, why does this happen??

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

Furthermore, while instantiating my sqliteHelperMoney2 object, if I change the instantiation of my sqliteHelperMoney2 object to this :

But why does this happen??

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

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

Furthermore, the documentation says that in the constructor for sqliteOpenHelper, in the field “NAME” you can specify null if the database is already in the memory. I was assuming that the database had been created in the app itself, so it will be in memory only

传递null将创建一个新的内存数据库.这意味着没有持久化到磁盘的新的空数据库.关闭数据库后,数据消失了.如果创建另一个内存数据库,它将看不到其他内存数据库中的数据.

But it works here but not in the other case.

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

Further, what is the name of database created by default?

没有.内存数据库没有名称.命名数据库将使用您提供的名称存储在磁盘上.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐