【发布时间】:2015-06-18 07:51:38
【问题描述】:
我一直在使用 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 表中获取数据,在我的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 方法。如果它们每次都在数据存储的地方运行,因为当我们关闭它时我们会丢失数据库??
【问题讨论】:
标签: android sqlite sqliteopenhelper