Search code examples
androiddatabasesqlitesqliteopenhelper

Confused regarding SQLiteOpenHelper and creating multiple tables


I feel the Android developer guidelines regarding saving data in SQLite is really lacking. I'm confused as to what the general guideline is when it comes to multiple tables.

I currently have two Managers that expose (CRUD) two different sets of entities to the UI.

Do I:

Create a private class SQLiteOpenHelper inside each Manager. Each Helper will have its own onCreate for its own TABLE?

or

Create a single public class SQLiteOpenHelper that creates both TABLE's?

I don't see any clear advantages to using the one above the other but I see both of them being used. What does Android say about this?


Solution

  • The following example code creates two tables. I also added code for creating and inserting data.

    import android.content.Context;
    import android.database.Cursor;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.util.Log;
    
    public class MyDB {
        public static final String KEY_ROWID = "_id";
        public static final String KEY_FIRSTNAME = "ID";
        public static final String KEY_LASTNAME = "CS";
        public static final String KEY_DESIGNATION = "CN";
        public static final String KEY_DN = "DN";  
    
        private static final String TAG = "MyDB";       
        private static final String DATABASE_NAME = "test.db";    
        private static final int DATABASE_VERSION = 1;
    
        private static final String DATABASE_CREATE_ValidateUser_DriverInfo =
            "create table tabletest1 (_id integer primary key autoincrement, "
            + "ID text not null, CS text not null, CN text not null, DN text not null);";
    
        private static final String DATABASE_CREATE_ValidateUser_TripInfo =
            "create table tabletest2 (_id integer primary key autoincrement, "
            + "TI text not null, PU text not null, LN text not null, FN text not null, Origin varchar not null, De text not null);";
    
        private Context context;
        private DatabaseHelper DBHelper;
        private SQLiteDatabase db;
    
        public MyDB(Context ctx) {
            this.context = ctx;
            DBHelper = new DatabaseHelper(context);
        }
    
        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_ValidateUser_DriverInfo);
                    db.execSQL(DATABASE_CREATE_ValidateUser_TripInfo);
            }
    
            @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("DROP TABLE IF EXISTS tabletest1");
                db.execSQL("DROP TABLE IF EXISTS tabletest2");
                onCreate(db);
            }
        }
    
        public MyDB open() throws SQLException {
            db = DBHelper.getWritableDatabase();
            return this;
        }
    
        //---closes the database---    
        public void close() {
            DBHelper.close();
        }
    
        public long insertTitle(ContentValues initialValues, String TableName) {
            return db.insert(TableName, null, initialValues);
        }
    }
    

    USe the following code to insert the data from your required activity.

    MyDB mmdb=new MyDB(getBaseContext());
    mmdb.open();
    
    initialValues = new ContentValues();
    initialValues.put("ID", ID);
    initialValues.put("CS", CS);
    initialValues.put("CN", CN);
    initialValues.put("DN", DN);
    
    mmdb.insertTitle(initialValues, "tabletest1");  
    
    mmdb.close();