I have been working with Android and SQLite Database to develop an application. But I am having a few problems. This is my code:
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");
Now the problem is, that in my cursor cursorCategory
I get the data that is stored in the Category
table of my database. But I do not get any data in the cursorTransaction
, why does this happen??
Furthermore, while instantiating my SQLiteHelperMoney2
object, if I change the instantiation of my SQLiteHelperMoney2
object to this :
SQLiteHelperMoney SQLiteHelperMoney2 = new SQLiteHelperMoney(this, "TRANSACTIONS", null, 1);
then I get the data from the Transaction
table, in my cursorTransaction
.
But why does this happen?? According to the documentation, in the constructor of the SQLiteOpenHelper, the second parameter, is the name of the database, not the name of the table. Then why does giving the name of the TABLE, in the field NAME OF DATABASE, gives the correct answer?
Furthermore, the documentation says that in the constructor for SQLiteOpenHelper, in the field "NAME" you can specify null
if the database is already in the memory. I was assuming that the database had been created in the app itself, so it will be in memory only, that is why I specify the second parameter as null here :
SQLiteHelperMoney SQLiteHelperMoney1 = new SQLiteHelperMoney(this, null, null, 1);
But it works here but not in the other case.
Further, what is the name of database created by default? Because I haven't specified it in my onCreate
function of the SQLiteOpenHelper. And can I change the name of my database??
EDIT:
onCreate
method:
@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: I read your answer here : When is SQLiteOpenHelper onCreate() / onUpgrade() run?
And I'm a bit confused about the on-disk and in-memory database. In my onCreate
method, I add rows in my Category
table, because I believed that the onCreate method is only called once in the lifetime of the application, i.e., when it is run the first time, for creating the databases.
That is why in my onCreate
method I add data into my CATEGORY
table, because I wanted it to have some initial data.
And I believed when we make substituent calls to getReadableDatabase()
and getWritableDatabase()
it returns us a copy of the earlier created database for us to work with, or probably a handle to the original database and on completion saves those changes. But, after reading your answer it seems that the onCreate
methods are run every time. If they are run everytime where does the data get stored, since we will loose the database when we close it??
The query returns no data from in the in-memory database you just created.
The query returns some data from the on-disk database that has been previously created.
For some coincidence the name of the database file is the same as the table. Uninstall and reinstall your app, or clear its data in the app manager to get rid of possible old database files possibly still around.
Passing a null creates a new in-memory database. It means a new, empty database that is not persisted to disk. When the database is closed, the data is gone. If you create another in-memory database, it won't see the data in other in-memory databases.
Possibly because the other helper populates the database in its
onCreate()
and the other doesn't.Nothing. In-memory databases have no name. Named databases get stored on disk with the name you gave.