首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQLiteOpenHelper问题

SQLiteOpenHelper问题
EN

Stack Overflow用户
提问于 2015-06-18 07:51:38
回答 1查看 182关注 0票数 3

我一直在与安卓和SQLite数据库一起开发一个应用程序。但我有几个问题。这是我的密码:

代码语言:javascript
运行
复制
        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的构造函数中,第二个参数是数据库的名称,而不是表的名称。那么,为什么在数据库的字段名中给出表的名称给出正确的答案呢?

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

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

但它在这里管用,但在另一种情况下就不行了。

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

编辑:

onCreate方法:

代码语言:javascript
运行
复制
@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方法。如果它们每次运行,数据存储在哪里,因为当我们关闭数据库时,我们会松掉它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-18 08:05:30

现在的问题是,在我的游标cursorCategory中,我获得了存储在数据库分类表中的数据。但是我在cursorTransaction中没有任何数据,为什么会发生这种情况?

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

此外,在实例化我的SQLiteHelperMoney2对象时,如果我将SQLiteHelperMoney2对象的实例化更改为: ..。 但为什么会这样?

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

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

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

传递null将创建一个新的内存数据库.它意味着一个新的、空的数据库,它不会被保存到磁盘上。当数据库关闭时,数据就会消失。如果您创建另一个内存中的数据库,它将不会看到其他内存数据库中的数据.

但它在这里管用,但在另一种情况下就不行了。

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

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

没什么。内存中数据库没有名称.命名数据库以您指定的名称存储在磁盘上。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30909518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档