我一直在使用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 = new SQLiteHelperMoney(this, "TRANSACTIONS", null, 1);
然后我从Transaction
。{/ p>中的cursorTransaction
表中获取数据
但为什么会这样呢?根据文档,在SQLiteOpenHelper的构造函数中,第二个参数是数据库的名称,而不是表的名称。 那么为什么在NAME OF DATABASE字段中给出TABLE的名称会给出正确的答案呢?
此外,文档说在SQLiteOpenHelper的构造函数中,如果数据库已经在内存中,则可以在“NAME”字段中指定null
。我假设数据库是在应用程序本身创建的,所以它只在内存中,这就是为什么我在这里指定第二个参数为null:
SQLiteHelperMoney SQLiteHelperMoney1 = new 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
方法中,我在Category
表中添加行,因为我认为onCreate方法仅在应用程序的生命周期中调用一次,即,当它第一次运行时,创建数据库。
这就是为什么在我的onCreate
方法中我将数据添加到我的CATEGORY
表中,因为我希望它有一些初始数据。
我相信当我们对getReadableDatabase()
和getWritableDatabase()
进行取代调用时,它会返回我们先前创建的数据库的副本供我们使用,或者可能是原始数据库的句柄并在完成时保存这些更改。但是,在阅读完答案后,似乎每次都会运行onCreate
方法。如果它们每次运行都会存储数据,因为当我们关闭数据库时我们会松开数据库??
答案 0 :(得分:3)
现在的问题是,在我的游标cursorCategory中,我得到了存储在我的数据库的Category表中的数据。但是我没有在cursorTransaction中获得任何数据,为什么会这样呢?
查询不返回您刚刚创建的内存数据库中的数据。
此外,在实例化我的SQLiteHelperMoney2对象时,如果我将SQLiteHelperMoney2对象的实例化更改为:
...
但为什么会这样呢?
查询返回先前已创建的磁盘数据库中的一些数据。
有些巧合,数据库文件的名称与表格相同。卸载并重新安装您的应用程序,或在应用程序管理器中清除其数据,以删除可能仍然存在的旧数据库文件。
此外,文档说在SQLiteOpenHelper的构造函数中,在“NAME”字段中,如果数据库已经在内存中,则可以指定null。我假设数据库是在应用程序本身创建的,所以它只在内存中
传递null会创建一个新的内存数据库。它表示一个新的空数据库,不会持久保存到磁盘。数据库关闭后,数据消失了。如果您创建另一个内存数据库,它将不会在其他内存数据库中看到数据。
但它在这里有效但在另一种情况下却没有。
可能是因为另一个帮助者在其onCreate()
中填充数据库而另一个没有。
此外,默认情况下创建的数据库的名称是什么?
无。内存数据库没有名称。命名数据库以您给出的名称存储在磁盘上。