I want to download data from the Firebase Firestore (array of names) and create the SQL table and feed the table with the data from the server. And every time I launch the app, I check version number from firebase, if it is the same as the SQL database version, and if it's not I recreate the table and populate it with new data.
Problem is I did something wrong with creating and checking the version number, so I get
android.database.sqlite.SQLiteException: Can't downgrade database from version 5 to 4.
This exception is pretty straightforward but I do not know where I messed up.
This is my SQLiteOpenHelper class
public class SQLBazaNamirnica extends SQLiteOpenHelper {
private static final String Ime_Baze = "baza_namirnica";
private static final String IME_TABELE = "tabela_namirnica";
private static final String ID_KOLONA = "id";
private static final String NAMIRNICA_KOLONA = "namirnica";
private static int VERZIJA_BAZE = 4;
SQLiteDatabase db;
Context context;
public SQLBazaNamirnica(Context context) {
super(context, Ime_Baze, null, VERZIJA_BAZE);
}
#Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
this.db = sqLiteDatabase;
String kreirajTabelu = "CREATE TABLE " + IME_TABELE +
" (" + ID_KOLONA + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
NAMIRNICA_KOLONA + " TEXT )";
db.execSQL(kreirajTabelu);
}
#Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int staraV, int novaV) {
if(staraV != novaV)
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + IME_TABELE);
}
boolean CheckVerziju(int novaVer) {
//db = getWritableDatabase();
SQLiteDatabase _db = this.getWritableDatabase();
Log.d("SQL VERZIJA", "CheckVerziju: VERZIJA BAZE: " + _db.getVersion() + " \n VERZIJA FIREBASE BAZE: " + novaVer);
if(_db.getVersion() != novaVer) {
//VERZIJA_BAZE = novaVer;
_db.setVersion(novaVer);
return true;
} else return false;
}
void KreirajTabelu() {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("DROP TABLE IF EXISTS " + IME_TABELE);
String kreirajTabelu = "CREATE TABLE " + IME_TABELE +
" (" + ID_KOLONA + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
NAMIRNICA_KOLONA + " TEXT )";
db.execSQL(kreirajTabelu);
Log.d("SQL", "KreirajTabelu: BAZA JE KREIRANA");
}
void updateBazu(SQLiteDatabase db, ArrayList<String> namirnice) {
db = getWritableDatabase();
ContentValues cv = new ContentValues();
for(String namirnica : namirnice) {
/* String query = "INSERT INTO " + IME_TABELE + " (" +
NAMIRNICA_KOLONA + ") VALUES (" + namirnica + ")"; */
cv.put(NAMIRNICA_KOLONA, namirnica);
db.insert(IME_TABELE, null, cv);
}
}
}
And this is how I'm the checking version number :
bazaNamirnica = new SQLBazaNamirnica(MainActivity.this);
namirniceDokument.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
#Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
if(documentSnapshot.exists()) {
int verzijaBaze = documentSnapshot.getLong("verzija").intValue();
if(bazaNamirnica.getReadableDatabase().getVersion() != verzijaBaze) {
//bazaNamirnica.ve
bazaNamirnica.KreirajTabelu();
Map<String, Object> namirnice = documentSnapshot.getData();
ArrayList<String> namirniceFinal = new ArrayList<>();
for(Map.Entry<String, Object> namirnica : namirnice.entrySet()) {
namirniceFinal.add(namirnica.getValue().toString());
}
bazaNamirnica.updateBazu(bazaNamirnica.getWritableDatabase(), namirniceFinal);
bazaNamirnica.getWritableDatabase().setVersion(verzijaBaze);
}
First of all, you should always consider checking if you have an updated version which is greater than your current version of the database. The onUpgrade function will only be called when there is an increase in the database version.
I am not sure what are the data that you are getting from the firebase database. However, I would like to suggest some changes to your code.
Instead of checking not equal, you might consider checking if the database version is greater like the following.
if (bazaNamirnica.getReadableDatabase().getVersion() < verzijaBaze) {
// Do the upgrade operation.
}
And also, I am not sure what you are trying to do on the version update. However, if you are dropping a table, you might need to create a new one with the updated structure that you need while upgrading your database.
#Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int staraV, int novaV) {
// if(staraV != novaV) // Not necessary, as this will be called on increase in the database version.
// So you have dropped the table here
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + IME_TABELE);
// Should create a new one with the updated database schema that you got
createDatabaseTableWithUpdatedSchema();
}
Hope that helps!
Related
Unfortunately all the solutions I could find, would not help me with my problem.
With a button click I want to add some value to my database table, but first it should check if the row already exists in my table, if so it just should update the row.
Here are my Codes:
MAIN ACTIVITY: (Just the Button Click)
ingredient= new Ingredient();
btnAdd.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
for(int i = 0; i < dataSource.size();i++){
tvname = (TextView) shoppingList.getChildAt(i).findViewById(R.id.tvName);
tvamount = (TextView) shoppingList.getChildAt(i).findViewById(R.id.tvAmount);
String nameTV = tvname.getText().toString();
String amountTV = tvamount.getText().toString();
ingredient.setName(nameTV);
ingredient.setAmount(amountTV);
ingredient.setId(i);
TableIngredient.getInstance(IngredientShopping.this).checkRow(ingredient);
}
DATABASE TABLE:
public class TableIncredient extends SQLiteOpenHelper {
public static TableIngredient INSTANCE = null;
public static final String DB_NAME = "INGREDIENT_TABLE";
public static final int VERSION = 1;
public static final String TABLE_NAME = "ingredient_table";
public static final String KEY_ID = "ID";
public static final String COL_NAME = "Name";
public static final String COL_AMOUNT = "AMOUNT";
public TableIngredient (Context context) {
super(context, DB_NAME, null, VERSION);
}
#Override
public void onCreate(SQLiteDatabase db) {
String createQuery = "CREATE TABLE " + TABLE_NAME
+ "(" + KEY_ID + " INTEGER PRIMARY KEY, "
+ COL_NAME + " TEXT NOT NULL, "
+ COL_AMOUNT + " INTEGER DEFAULT NULL)";
db.execSQL(createQuery);
}
public boolean checkRow(Ingredient ingredient){
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.query(TABLE_NAME,
new String[]{KEY_ID, COL_NAME, COL_AMOUUNT},
KEY_ID + " =? AND " + COL_NAME + " =? AND " + COL_AMOUNT + " =?" ,
new String[]{String.valueOf(ingredient)},
null, null, null, null);
ContentValues values = new ContentValues();
values.put(COL_NAME, ingredient.getName());
values.put(COL_AMOUNT, ingredient.getAmount());
if (c.moveToFirst()){
increseIngredient(ingredient);
return true;
}
else {
long newID = db.insert(TABLE_NAME, null, values);
db.close();
getIngredient(newID);
return false;
}
}
}
With this code it always uses the else statement and I do not know why this happens.
I hope someone can help me to create a new row if it not exists and update the row if it exists.
With this code it always uses the else statement and I do not know why
this happens.
The reason why this happens is that the 4th parameter to the query method is new String[]{String.valueOf(ingredient)}
This will resolve to being a value something like Ingredient#1091 do you have an ingredient row that has an ID like that (rhetorical as that cannot be the case due to the ID column being an alias of the rowid and therefore ONLY integer values can be stored).
The reason that Ingredient#1091 is that the String value of the Ingredient object will be a pointer to the object.
As such no rows will ever be returned.
If instead you used new String[]{String.valueOf(ingredient.getId),ingredient.getName,ingredient.getAmount)}
The 3 values would (should), be the correct values (assuming that the ID is stored correctly in the Ingredient).
I'm developing a fitness tracker android app and have set up a SQLite database with 2 tables successfully. One table is for saving data about cardio exercises and one table is for saving data about weight lifting exercises. I'm able to save information to the cardio table (saved_workout_cardio) however, I can't seem to save anything to the weight lifting table (saved_workout_weights). I started off by coding the functionality for saving to 'saved_workout_cardio' table and once I had successfully got that working, I just copy and pasted the code and edited it to fit what was needed for saving to 'saved_workout_weights' table, however unfortunately it's not working and I'm puzzled as to why.
Below is the code from my databasehelper java class where I create the database as well as 2 methods, 1 for saving data to each table:
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "FitnessTracker.db";
public static final String TABLE_WEIGHTS = "saved_workout_weights";
public static final String COL_1 = "ID";
public static final String COL_2 = "DATE";
public static final String COL_3 = "EXERCISE";
public static final String COL_4 = "WEIGHT";
public static final String COL_5 = "REPS";
public static final String COL_6 = "SETS";
public static final String TABLE_CARDIO = "saved_workout_cardio";
public static final String COL_1a = "ID";
public static final String COL_2a = "DATE";
public static final String COL_3a = "TIME";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
}
#Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + TABLE_WEIGHTS + " (ID INTEGER PRIMARY KEY AUTOINCREMENT,DATE TEXT,EXERCISE TEXT,WEIGHT INTEGER,REPS INTEGER)");
db.execSQL("create table " + TABLE_CARDIO + " (ID INTEGER PRIMARY KEY AUTOINCREMENT,DATE TEXT,TIME INTEGER)");
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_WEIGHTS);
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_CARDIO);
onCreate(db);
}
public boolean saveData (String date, String time) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_2a, date);
contentValues.put(COL_3a, time);
long result = db.insert(TABLE_CARDIO, null, contentValues);
if(result == -1)
return false;
else
return true;
}
public boolean saveData2 (String date, String exercise, String weight, String reps, String sets) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues2 = new ContentValues();
contentValues2.put(COL_2, date);
contentValues2.put(COL_3, exercise);
contentValues2.put(COL_4, weight);
contentValues2.put(COL_5, reps);
contentValues2.put(COL_6, sets);
long result = db.insert(TABLE_WEIGHTS, null, contentValues2);
if(result == -1)
return false;
else
return true;
}
}
Now here's the relevant code from my 'Cardio' java class where I'm calling the method for saving data to the cardio table (this method works and I'm able to save data to the cardio table successfully:
public void saveCardioData () {
btnSaveCardio.setOnClickListener(
new View.OnClickListener() {
#Override
public void onClick(View v) {
boolean isInserted = myDb.saveData(txtDate.getText().toString(),
txtTimer.getText().toString() );
if(isInserted = true)
Toast.makeText(Cardio.this, "Workout saved", Toast.LENGTH_LONG).show();
else
Toast.makeText(Cardio.this, "Error saving workout", Toast.LENGTH_LONG).show();
}
}
);
}
Now here's the 'weights' java class where I call the method for saving data to the weights table. As you can see I have set up a toast message to appear if data is successfully inserted. Whenever I click to save the workout in my app the toast message tells me that the workout has been successfully saved however, when I check the weights table in my database no values have been saved.
public void saveWeightsData () {
btnSaveWeights.setOnClickListener(
new View.OnClickListener() {
#Override
public void onClick(View v) {
boolean isInserted = myDb.saveData2(exerciseVal.getText().toString(),
weightVal.getText().toString(),
repVal.getText().toString(),
setVal.getText().toString(),
dateVal.getText().toString() );
if(isInserted = true)
Toast.makeText(WeightsMain.this, "Workout saved", Toast.LENGTH_LONG).show();
else
Toast.makeText(WeightsMain.this, "Error saving workout", Toast.LENGTH_LONG).show();
}
}
);
}
Really confused as to why I'm having this problem, so if anyone can tell me why it would be greatly appreciated! :)
EDIT: I'm using Android Device Monitor within Android studio to pull the database from the android emulator's storage to my pc. I then use SQLite Manager firefox addon to check the 2 tables.
There's no SETS column in your table but you're trying to insert data to it. That won't work.
After adding the SETS column to the CREATE TABLE, you can uninstall your app to force onCreate() to execute again.
I recently launched an app on the android app store that contained a SQLite database.
I am now attempting to release an update of the app, and want to add more data into the existing database, however have come a bit unstuck. I have read answers on SO that outline making changes to the database itself, however I want my tables and columns to stay the same, only add new data in.
The data that i want to add to the database is pulled from CSV files in the Raw file, and originally loaded into the database when the user registers for the app.
I have a feeling I am going to need to implement the onUpgrade method, however should I be adding the new data from the CSV files in at that point as well? Is it a matter of simple updating the database version and using the onUpgrade to load the new data?
I am fairly new to SQLite DB, so any help would be hugely appreciated.
CourseDBHelper Code
public class CourseDBHelper extends SQLiteOpenHelper {
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "CourseDB";
// Create two table names
private static final String TABLE_COURSES = "courses";
// Universities Table Columns names
private static final String COURSE_NAME = "Course_name";
private static final String UNI_NAME = "Uni_name";
private static final String COURSE_DURATION = "Duration";
private static final String COURSE_STUDY_MODE = "Study_mode";
private static final String COURSE_QUALIFICATION = "Qualification";
private static final String COURSE_ENTRY_STANDARDS = "Entry_standards";
private static final String COURSE_GRADUATE_PROSPECTS = "Graduate_prospects";
private static final String COURSE_STUDENT_SATISFACTION = "Student_satisfaction";
private String CREATE_COURSES_TABLE = "CREATE TABLE courses" +
"(" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"Course_name TEXT NOT NULL," +
"Uni_name TEXT NOT NULL," +
"Duration TEXT NOT NULL," +
"Study_mode TEXT NOT NULL," +
"Qualification TEXT NOT NULL," +
"Entry_standards TEXT NOT NULL," +
"Graduate_prospects TEXT NOT NULL," +
"Student_satisfaction TEXT NOT NULL" +
");";
private static final String[] COLUMNS = {
COURSE_NAME,
UNI_NAME,
COURSE_DURATION,
COURSE_STUDY_MODE,
COURSE_QUALIFICATION,
COURSE_ENTRY_STANDARDS,
COURSE_GRADUATE_PROSPECTS,
COURSE_STUDENT_SATISFACTION
};
public CourseDBHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// TODO: REMOVED NOT NULL FROM EVERY COLUMN FOR TEST PURPOSES, WILL NEED TO BE READDED
#Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(CREATE_COURSES_TABLE);
}
public void deleteAll()
{
SQLiteDatabase db = this.getWritableDatabase();
db.delete("courses", null, null);
db.execSQL("delete from " + "courses");
db.close();
}
// Getting one course by course name and uni name
public Course getCourse(String courseName, String uniName) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_COURSES, COLUMNS, " Course_name = ? AND Uni_name = ?",
new String[]{courseName, uniName},
null,
null,
null,
null);
if (cursor != null)
cursor.moveToFirst();
Course course = new Course();
/*
System.out.println(cursor.getString(0));
System.out.println(cursor.getString(1));
System.out.println(cursor.getString(2));
System.out.println(cursor.getString(3));
System.out.println(cursor.getString(4));
System.out.println(cursor.getString(5));
System.out.println(cursor.getString(6));
*/
course.setCourseName(cursor.getString(0));
course.setUniversity(cursor.getString(1));
course.setCourseDuration(cursor.getString(2));
course.setStudyMode(cursor.getString(3));
course.setQualification(cursor.getString(4));
course.setEntryStandards(cursor.getString(5));
course.setGradProspects(cursor.getString(6));
course.setStudentSatisfaction(cursor.getString(7));
return course;
}
public void addCourse(Course course)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COURSE_NAME, course.getCourseName());
values.put(UNI_NAME, course.getUniversity());
values.put(COURSE_DURATION, course.getCourseDuration());
values.put(COURSE_STUDY_MODE, course.getStudyMode());
values.put(COURSE_QUALIFICATION, course.getQualification());
values.put(COURSE_ENTRY_STANDARDS, course.getEntryStandards());
values.put(COURSE_GRADUATE_PROSPECTS, course.getGradProspects());
values.put(COURSE_STUDENT_SATISFACTION, course.getStudentSatisfaction());
db.insert(TABLE_COURSES,
null, //nullColumnHack
values);
db.close();
}
public ArrayList<Course> getAllCourses()
{
ArrayList<Course> courses = new ArrayList<>();
// 1. build the query
String query = "SELECT * FROM " + TABLE_COURSES;
// 2. get reference to writable DB
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query, null);
// 3. go over each row, build course and add it to list
Course course;
if(cursor.moveToFirst()){
cursor.moveToNext();
do{
course = new Course();
course.setCourseName(cursor.getString(1));
course.setUniversity(cursor.getString(2));
course.setCourseDuration(cursor.getString(3));
course.setStudyMode(cursor.getString(4));
course.setQualification(cursor.getString(5));
course.setEntryStandards(cursor.getString(6));
course.setGradProspects(cursor.getString(7));
course.setStudentSatisfaction(cursor.getString(8));
// Add course to courses list
courses.add(course);
} while(cursor.moveToNext());
}
// return courses
return courses;
}
public int getDBCount()
{
SQLiteDatabase db = this.getWritableDatabase();
String count = "SELECT count(*) FROM courses";
Cursor mcursor = db.rawQuery(count, null);
mcursor.moveToFirst();
int icount = mcursor.getInt(0);
return icount;
}
public void deleteCourse(Course course) {
// 1. get reference to writable DB
SQLiteDatabase db = this.getWritableDatabase();
// 2. delete
db.delete("courses", //table name
"Course_name = ? AND Uni_name = ?", // selections
new String[] { course.getCourseName(), course.getUniversity() }); //selections args
// 3. close
db.close();
}
#Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
Method that loads data from CSV file to SQlite DB
public void populateCourseDatabase(int id) {
// NOW POPULATE THE COURSE DATABASE FILE
inputStream = getResources().openRawResource(R.raw.coursesone);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String word;
String cvsSplitBy = ",";
try{
while((word = reader.readLine()) != null){
Log.d(TAG, "constructing Course object from: " + word);
String[] segment = word.split(cvsSplitBy);
Course course = new Course();
course.setCourseName(segment[0]);
course.setUniversity(segment[1]);
course.setCourseDuration(segment[2]);
course.setStudyMode(segment[3]);
course.setQualification(segment[4]);
course.setEntryStandards(segment[5]);
course.setGradProspects(segment[6]);
course.setStudentSatisfaction(segment[7]);
myCourseDBHelper.addCourse(course);
progressBar.setProgress(count);
count = count + 1;
System.out.println("Sucessfully added: " + course.toString());
}
}
catch(IOException e1){
e1.printStackTrace();
System.out.println("SOMETHING WENT WRONG");
}
}
SQLiteOpenHelper onCreate() and onUpgrade() callbacks are invoked when the database is actually opened, for example by a call to getWritableDatabase().onCreate() is only run when the database file did not exist and was just created. onUpgrade() is only called when the database file exists but the stored version number is lower than requested in constructor.Increment the database version so that onUpgrade() is invoked.
Example pseudo code below
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch(oldVersion) {
case 1:
//upgrade logic from version 1 to 2
case 2:
//upgrade logic from version 2 to 3
case 3:
//upgrade logic from version 3 to 4
break;
default:
throw new IllegalStateException(
"onUpgrade() with unknown oldVersion " + oldVersion);
}
}
When I run my android app I keep getting the error (1) no such table userTable, as far as I am aware I am creating the table in
TABLE_CREATE = "create table userTable("
+ USER + " text not null, " + PWD + " text not null, );";
I have two other databases in this project and the are working fine, any help is welcome.
package com.weightpro.db;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class usrPwdDB {
public static final String USER = "userName";
public static final String PWD = "password";
public static final String TABLE_NAME = "userTable";
public static final String DATA_BASE_NAME = "userdatabase";
public static final String KEY_ROWID = "_id";
public static final int DB_VERSION = 2;
private static final String TABLE_CREATE = "create table userTable("
+ USER + " text not null, " + PWD + " text not null, );";
DBHelper WDBHelper;
Context mContext;
SQLiteDatabase db;
public usrPwdDB(Context mContext) {
this.mContext = mContext;
WDBHelper = new DBHelper(mContext);
}
private static class DBHelper extends SQLiteOpenHelper
{
public DBHelper(Context context) {
super(context,DATA_BASE_NAME, null, DB_VERSION);
}
#Override
public void onCreate(SQLiteDatabase db) {
try{
db.execSQL(TABLE_CREATE);
}
catch(SQLException e)
{
e.printStackTrace();
}
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS userTable");
onCreate(db);
}
}
public usrPwdDB open()
{
db = WDBHelper.getWritableDatabase();
return this;
}
public void close(){
WDBHelper.close();
}
public long insertInfo(String userName, String password){
ContentValues content = new ContentValues();
content.put(USER, userName);
content.put(PWD, password);
return db.insertOrThrow(TABLE_NAME, null, content);
}
public boolean getUserNameAndPassword(String userName, String Password) throws SQLException {
Cursor mCursor =
db.query(true, TABLE_NAME, new String[] {USER,
PWD},USER+"='"+userName+"' AND password='"+Password+"'", null,
null, null, null, null);
if (mCursor.getCount() > 0)
{
return true;
}
return false;}
public Cursor returnData(){
return db.query(TABLE_NAME, new String[] {USER, PWD},null,null,null,null,null);
}
}
remove the last comma , from the create table syntax,
private static final String TABLE_CREATE =
"create table userTable("
+ USER + " text not null, "
+ PWD + " text not null, );"; // remove this comma after not null
The correct syntax should be
private static final String TABLE_CREATE =
"create table userTable("
+ USER + " text not null, "
+ PWD + " text not null );";
You go wrong over here
+ USER + " text not null, " + PWD + " text not null, );"; //remove , from last text not null
correct SQL command with below
private static final String TABLE_CREATE = "create table userTable("
+ USER + " text not null, " + PWD + " text not null);" ;
private static final String TABLE_CREATE = "create table userTable("
+ USER + " text not null, " + PWD + " text not null,);" ;
remove "," after "text not null" and also remove ";"(semicolon) in the string, that is not needed i think,
then clear data or uninstall application then execute again
even though the creation of table failed i think next time onCreate() in SQLiteOpenHelper only executes once, so you will need to clear data of application
if you are using separate class for separate table and using same DB name, then all the tables in the first using class will be ok, and others will not be created since for a single database onCreate() function works only one, even if there is separate classes each with onCreate(),
onCreate() function creates a file in DB location of android file system when first called onCreate(), if the onCreate called again it check for the existence of DBNAME file in DB location and avoid creating if its exit, I think this is logic behind it...
so keep one onCreate() function for a single DB file and create all tables in that function
This is my Database class
public class ProgramDbAdapter{
public static final String KEY_ROWID = "_id";
public static final String KEY_PROGRAM_TITLE = "ProgramTitle";
public static final String KEY_PROGRAM_DATE = "ProgramDate";
public static final String KEY_PROGRAM_TIME = "ProgramTime";
public static final String KEY_PROGRAM_CHANNEL = "ProgramChannel";
private static final String DATABASE_CREATE =
"CREATE TABLE " + DATABASE_TABLE + " (" + "_id integer primary key autoincrement, "
+ "ProgramTitle text, " + "ProgramDate varchar(20), "
+ "ProgramTime varchar(20), " + "ProgramChannel text)";
private static final String DATABASE_UPGRADE = "DROP TABLE IF EXISTS " + DATABASE_TABLE;
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
#Override
public void onCreate(SQLiteDatabase db){
db.execSQL(DATABASE_CREATE);
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL(DATABASE_UPGRADE);
onCreate(db);
}
}
public ProgramDbAdapter open() throws SQLException{
mDbHelper = new DatabaseHelper(mcontext);
mDb = mDbHelper.getWritableDatabase();
return this;
}
public long CreateData(String ProgramTitle, String ProgramDate, String ProgramTime, String ProgramChannel){
ContentValues initialvalues = new ContentValues();
initialvalues.put(KEY_PROGRAM_TITLE, ProgramTitle);
initialvalues.put(KEY_PROGRAM_DATE, ProgramDate);
initialvalues.put(KEY_PROGRAM_TIME, ProgramTime);
initialvalues.put(KEY_PROGRAM_CHANNEL, ProgramChannel);
return mDb.insert(DATABASE_TABLE, null, initialvalues);
}
}
This is my main class
public class Program extends ExpandableListActivity{
public void onCreate(Bundle savedInstanceState) {
mDbHelper = new ProgramDbAdapter(this);
mDbHelper.open();
mDbHelper.CreateData("a","a","a","a");
}
}
when i call open() and createdata function, the logcat tell me no such table:Program. where is the problem is?
There is no varchar type in sqlite, see here. Use text instead.
I don't see where 'DATABASE_TABLE' is coming from.
Also, you should use the "rawQuery()", "query()"-Methods or a "SQLiteStatement" to bind parameters into your SQL-Statement.
And last but not least, SQLite doesn't know any 'varchar'. Check here for all Data types: Link
varchar is translated to text ...
from vladimir link:
If the declared type of the column
contains any of the strings "CHAR",
"CLOB", or "TEXT" then that column has
TEXT affinity. Notice that the type
VARCHAR contains the string "CHAR" and
is thus assigned TEXT affinity.
problem is that u created db in first run and there was different Create statment ...
delete app data from android settings or change DATABASE_VERSION