As I make the SQLite in android app, I made 3 class. first is "MyDatabaseHelper.java" that make database and table. second is "MyDB.java" that contain some functions(insert, cursor, update, delete). third is "MyDBDefaultValues" that make default values using insert function in "MyDB.java".
The point is about transaction. following the transaction manual(Android Database Transaction), I need to insert "db.beginTransaction()" into "MyDB.java" because there are SQLitebase. but I make the default values using insert function in other class(MyDBDefaultValues.java).
As a results, I don't know where to add transaction in my code. I know if I make a default code in "MyDB.java", I can add transaction in "MyDB.java". but I want to separate "MyDB.java" and "MyDBDefaultValues.java".please tell me how to add transaction in my code.
Under is my code.
MyDatabaseHelper.java
public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "Torticollis";
private static final int DATABASE_VERSION = 1;
// Database creation sql statement
private static final String DATABASE_CREATE = "create table Torticollis_Management(" +
"_id integer primary key autoincrement, " +
"date text not null, " + // store date to text type and convert between formats using the built-in date and time functions
"stretching1 text, " +
"stretching2 text, " +
"stretching3 text, " +
"stretching4 text, " +
"stretching5 text," +
"today_pain integer);";
public MyDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
Log.d("confirm", "this is first's god");
}
// Method is called during creation of the database
@Override
public void onCreate(SQLiteDatabase database) {
database.execSQL(DATABASE_CREATE);
}
// Method is called during an upgrade of the database,
@Override
public void onUpgrade(SQLiteDatabase database,int oldVersion,int newVersion){
Log.w(MyDatabaseHelper.class.getName(),
"Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
database.execSQL("DROP TABLE IF EXISTS Torticollis_Management");
onCreate(database);
}
}
MyDB.java
public class MyDB{
private MyDatabaseHelper dbHelper;
private SQLiteDatabase database;
public final static String Tor_TABLE = "Torticollis_Management"; // name of table
public final static String Tor_ID = "_id"; // id value for Torticollis
public final static String Tor_DATE = "date"; // date of Torticollis
public final static String Tor_STRETCHING1 = "stretching1"; // stretching1 of Torticollis
public final static String Tor_STRETCHING2 = "stretching2"; // stretching2 of Torticollis
public final static String Tor_STRETCHING3 = "stretching3"; // stretching3 of Torticollis
public final static String Tor_STRETCHING4 = "stretching4"; // stretching4 of Torticollis
public final static String Tor_STRETCHING5 = "stretching5"; // stretching5 of Torticollis
public final static String Tor_TODAY_PAIN = "today_pain"; // today_pain of Torticollis
// today_pain value's type is "String" but it's real type is "int"
/**
*
* @param context
*/
public MyDB(Context context){ // why do I add this 'context'??
dbHelper = new MyDatabaseHelper(context);
}
public long insert(String date, String stretching1, String stretching2, String stretching3,
String stretching4, String stretching5, int today_pain){
database = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
// values.put(Tor_ID, id); // "id" don't need to insert because that's made "autoincrement".
values.put(Tor_DATE, date);
values.put(Tor_STRETCHING1, stretching1);
values.put(Tor_STRETCHING2, stretching2);
values.put(Tor_STRETCHING3, stretching3);
values.put(Tor_STRETCHING4, stretching4);
values.put(Tor_STRETCHING5, stretching5);
values.put(Tor_TODAY_PAIN, today_pain); // why do I have to inert "integer"'s today_pain value into "String"'s Tor_TODAY_PAIN?
return database.insert(Tor_TABLE, null, values);
}
public Cursor cursor() {
database = dbHelper.getReadableDatabase();
String[] cols = new String[] {Tor_ID, Tor_DATE, Tor_STRETCHING1, Tor_STRETCHING2, Tor_STRETCHING3,
Tor_STRETCHING4, Tor_STRETCHING5, Tor_TODAY_PAIN};
Cursor mCursor = database.query(true, Tor_TABLE, cols, null, null, null, null, null, null);
if (mCursor != null) {mCursor.moveToFirst();}
return mCursor; // iterate to get each value.
}
public boolean update(String date, String stretching1, String stretching2, String stretching3,
String stretching4, String stretching5, int today_pain) {
database = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
// values.put(Tor_ID, id); // "id" don't need to insert because that exist only for counting
values.put("date", date);
values.put("stretching1", stretching1);
values.put("stretching2", stretching2);
values.put("stretching3", stretching3);
values.put("stretching4", stretching4);
values.put("stretching5", stretching5);
values.put("today_pain", today_pain);
database.update("Torticollis_Management", values, "date = ?", new String[]{date}); // need to know this coding
return true;
}
public Integer delete(String date) {
database = dbHelper.getWritableDatabase();
return database.delete("Torticollis_Management", "id = ?", new String[]{date}); // need to know this coding
}
}
MyDBDefaultValues.java
public class MyDBDefaultValues {
MyDB mydb;
public MyDBDefaultValues(Context context){ // why do I have to write the word "context". what's the mean of "context"?
mydb = new MyDB(context);
insertDefaultValues(); // insert default values if there is no data.
}
public void insertDefaultValues() {
Cursor cursor = mydb.cursor();
cursor.moveToLast();
int count = cursor.getCount();
if(count > 0) {
// do nothing
} else { // insert default values if there is no data.
mydb.insert("2016-07-01", "X", "X", "X", "X", "X", 0);
mydb.insert("2016-07-02", "X", "X", "X", "X", "X", 0);
mydb.insert("2016-07-03", "X", "X", "X", "X", "X", 0);
mydb.insert("2016-07-04", "X", "X", "X", "X", "X", 0);
}
}
}