我一直在使用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?
没有.内存数据库没有名称.命名数据库将使用您提供的名称存储在磁盘上.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。