2015-06-18 3 views
3

Я работаю с 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 запускаются каждый раз. Если они запускаются каждый раз, когда данные хранятся, так как мы потеряем базу данных, когда мы ее закроем?

ответ

3

Теперь проблема заключается в том, что в моем курсоре cursorCategory я получаю данные, которые хранятся в таблице Category моей базы данных. Но я не получаю никаких данных в cursorTransaction, почему это происходит?

Запрос не возвращает данные из созданной вами базы данных в памяти.

Кроме того, в то время как инстанцировании мой объект SQLiteHelperMoney2, если изменить экземпляр моего объекта SQLiteHelperMoney2 к этому:

...

Но почему это происходит ??

Запрос возвращает некоторые данные из базы данных на диске, которая была ранее создана.

Для некоторых совпадений имя файла базы данных совпадает с именем таблицы. Удалите и переустановите приложение, или очистите его данные в диспетчере приложений, чтобы избавиться от возможных старых файлов базы данных, возможно, все еще вокруг.

Кроме того, в документации указано, что в конструкторе SQLiteOpenHelper в поле «NAME» вы можете указать значение null, если база данных уже находится в памяти. Я предполагал, что база данных была создана в самом приложении, поэтому она будет только в памяти

Передача нуля создает новую базу данных в памяти. Это означает новую, пустую базу данных, которая не сохраняется на диске. Когда база данных закрыта, данные исчезли. Если вы создадите другую базу данных в памяти, она не увидит данные в других базах данных в памяти.

Но он работает здесь, но не в другом случае.

Возможно, потому что другой помощник заполняет базу данных в своем onCreate(), а другой нет.

Кроме того, какое имя базы данных создано по умолчанию?

Ничего. Базы данных в памяти не имеют имени. Именованные базы данных сохраняются на диске с именем, которое вы указали.

+0

1) почему запрос не возвращает данные из встроенной памяти 'database2', которую я только что создал? 2) После создания экземпляра моего SQLiteHelperMoney2 я делаю второй запрос на 'database2', как он запрашивает ранее созданную базу данных? Я не понял. 3) Возможно ли, что, несмотря на наличие данных, 'onCreate' не заполняет базу данных ?? – user007

+0

Первоначально я делал оба запроса на одном объекте 'database1'. Но даже тогда я ничего не получал для своего запроса «Сделки». Я не был уверен, можно ли использовать одну базу данных для нескольких запросов, поэтому я создал другой экземпляр для создания 'database2' и запросил« TRANSACTIONS »там, но все равно не имел успеха. – user007

+0

Удалите приложение или очистите его данные, чтобы избавиться от возможного старого файла базы данных. Отредактируйте вопрос, чтобы добавить методы helper 'onCreate()'. – laalto

 Смежные вопросы

  • Нет связанных вопросов^_^