我一直在与安卓和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表中,在我的cursorTransaction中获取数据。
但为什么会这样?根据文档,在SQLiteOpenHelper的构造函数中,第二个参数是数据库的名称,而不是表的名称。那么,为什么在数据库的字段名中给出表的名称给出正确的答案呢?
此外,文档还指出,在SQLiteOpenHelper的构造函数中,如果数据库已经在内存中,则可以在字段"NAME“中指定null。我假设数据库是在应用程序本身中创建的,所以它只在内存中,这就是为什么我在这里将第二个参数指定为null:
SQLiteHelperMoney SQLiteHelperMoney1 = new SQLiteHelperMoney(this, null, null, 1);
但它在这里管用,但在另一种情况下就不行了。
此外,默认情况下创建的数据库的名称是什么?因为我还没有在我的onCreate函数SQLiteOpenHelper中指定它。我可以更改我的数据库的名称吗?
编辑:
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方法。如果它们每次运行,数据存储在哪里,因为当我们关闭数据库时,我们会松掉它?
发布于 2015-06-18 08:05:30
现在的问题是,在我的游标cursorCategory中,我获得了存储在数据库分类表中的数据。但是我在cursorTransaction中没有任何数据,为什么会发生这种情况?
该查询不返回您刚才创建的内存数据库中的数据。
此外,在实例化我的SQLiteHelperMoney2对象时,如果我将SQLiteHelperMoney2对象的实例化更改为: ..。 但为什么会这样?
查询从先前创建的磁盘上数据库返回一些数据。
出于某种巧合,数据库文件的名称与表相同。卸载并重新安装应用程序,或者清除应用程序管理器中的数据,以消除可能仍然存在的旧数据库文件。
此外,文档还指出,在SQLiteOpenHelper的构造函数中,如果数据库已经在内存中,则可以在字段"NAME“中指定null。我假设数据库是在应用程序本身中创建的,所以它只在内存中。
传递null将创建一个新的内存数据库.它意味着一个新的、空的数据库,它不会被保存到磁盘上。当数据库关闭时,数据就会消失。如果您创建另一个内存中的数据库,它将不会看到其他内存数据库中的数据.
但它在这里管用,但在另一种情况下就不行了。
可能是因为另一个助手在其onCreate()中填充了数据库,而另一个则没有。
此外,默认情况下创建的数据库的名称是什么?
没什么。内存中数据库没有名称.命名数据库以您指定的名称存储在磁盘上。
https://stackoverflow.com/questions/30909518
复制相似问题