Я работаю с Android и SQLite Database для разработки приложения. Но у меня проблемы. Это мой код:Проблемы с SQLiteOpenHelper
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, дает правильный ответ?
Кроме того, в документации указано, что в конструкторе для SQLiteOpenHelper в поле «NAME» вы можете указать null
, если база данных уже находится в памяти. Я предполагал, что база данных были созданы в самом приложении, так что это будет только в памяти, поэтому я указать второй параметр как нуль здесь:
SQLiteHelperMoney SQLiteHelperMoney1 = new SQLiteHelperMoney(this, null, null, 1);
Но он работает здесь, но не в в другом случае.
Кроме того, какое имя базы данных создано по умолчанию? Потому что я не указал его в моей onCreate
функции SQLiteOpenHelper. И могу ли я изменить имя моей базы данных?
EDIT:
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
запускаются каждый раз. Если они запускаются каждый раз, когда данные хранятся, так как мы потеряем базу данных, когда мы ее закроем?
1) почему запрос не возвращает данные из встроенной памяти 'database2', которую я только что создал? 2) После создания экземпляра моего SQLiteHelperMoney2 я делаю второй запрос на 'database2', как он запрашивает ранее созданную базу данных? Я не понял. 3) Возможно ли, что, несмотря на наличие данных, 'onCreate' не заполняет базу данных ?? – user007
Первоначально я делал оба запроса на одном объекте 'database1'. Но даже тогда я ничего не получал для своего запроса «Сделки». Я не был уверен, можно ли использовать одну базу данных для нескольких запросов, поэтому я создал другой экземпляр для создания 'database2' и запросил« TRANSACTIONS »там, но все равно не имел успеха. – user007
Удалите приложение или очистите его данные, чтобы избавиться от возможного старого файла базы данных. Отредактируйте вопрос, чтобы добавить методы helper 'onCreate()'. – laalto