ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

android-SQLiteOpenHelper问题

2019-11-20 05:24:59  阅读:240  来源: 互联网

标签:sqlite sqliteopenhelper android


我一直在使用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 =新的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?

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

标签:sqlite,sqliteopenhelper,android
来源: https://codeday.me/bug/20191120/2041701.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有