简体   繁体   中英

Android SQLite database is not created

The SQLite database is not created. I am playing with this for the past few hours but now i got tired a lot. I am not getting any errors or warnings in the Log Cat . Here is my code what I have tried so far. Help will be appreciated.

public class MySQLiteHelper extends SQLiteOpenHelper{
    final static String DB_NAME = "citiesdata.db";
    final static String TABLE_NAME = "allcities";
    final static String ID = "_id";
    final static String CITY_CODE = "city_code";
    final static int DB_VERSION = 1;
    private SQLiteDatabase db;
    Context cont;

    public MySQLiteHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        cont = context;
        Toast.makeText(cont, "constructor called", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Toast.makeText(cont, "onCreate method called", Toast.LENGTH_LONG).show();
        String createTable = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + CITY_CODE + " TEXT);";
        db.execSQL(createTable);

//      INSERTING RECORDS IN DATABASE
        SQLiteDatabase writableDB = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(CITY_CODE, "333");
        writableDB.insert(TABLE_NAME, null, values);
        writableDB.close();
        readCity();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Toast.makeText(cont, "onUpgrade method called", Toast.LENGTH_LONG).show();
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }


    public void readCity(){
        Toast.makeText(cont, "readCity method called", Toast.LENGTH_LONG).show();
        String selectQuery = "SELECT  * FROM " + TABLE_NAME;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        Toast.makeText(cont, cursor.getString(cursor.getColumnIndex(CITY_CODE)), Toast.LENGTH_LONG).show();
        db.close();
    }
}

Calling the Constructor in the main UI Thread on a button click like this.

new MySQLiteHelper(MainActivity.this);

Permissions are...

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE"/>

Thanks a lot in advance.

At last, I shot the problem directly into the head. But How?

The logic of the SQLiteOpenHelper is that it doesn't call the onCreate method by only creating its object.

  1. Whenever you try to access the database for retrieving or inserting data, if the database is not already created/available, it will call the onCreate method for the first time.
  2. The onUpgrade method will be called if the database is available but the version is lower than the one you provide.

I created a fillTable method in my MySQLiteHelper class where I tried to access the database for the first time for writing by calling getWritableDatabase method of the SQLiteOpenHelper . The definition of the fillTable method looks like this.

public void fillTable(){
    db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(CITY_CODE, "333");
    db.insert(TABLE_NAME, null, values);
    db.close();
    readCity();
}

Call the fillTable method on a new instance of the class:

new MySQLiteHelper(MainActivity.this).fillTable();

Thanks to all those who tried to help me in comments.

public MySQLiteHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
    cont = context;
    SQLiteDatabase db = this.getReadableDatabase();
    Toast.makeText(cont, "constructor called", Toast.LENGTH_LONG).show();
}

Change the constructor code, then it will work...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM