Calling function from another activity
Solution 1
Add the static keyword to your shared methods
public static void createTable()
Then use:
Data.createTable();
somewhere in another Class / Fragment / Activity.
I do so and it works.
Well, my "Data" is a normal Class, not an Activity, but I also have an Activity with shared methods in the very same way.
This is my dbTableCreate method:
// Create the database table if it doesn't exist
protected final static void dbTableCreate(final Context ctx)
{
SQLiteDatabase db = null;
try
{
db = ctx.openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
db.execSQL
(
"CREATE TABLE IF NOT EXISTS " + DB_TABLE +
" (date DATETIME PRIMARY KEY NOT NULL DEFAULT (CURRENT_DATE), " +
"score INTEGER DEFAULT (null));"
);
}
catch (final SQLiteException se)
{
System.out.println
(
ctx.getClass().getSimpleName() + "\n" +
"Could not create the database"
);
se.printStackTrace();
}
finally
{
db.close();
}
}
And I call it like:
Context ctx = getApplicationContext();
CLS_DB.dbTableCreate(ctx);
The main difference between my class and yours is that mine is declared as
public final class CLS_DB
{
/* ----------------------------- Constants ------------------------------ */
private final static String DB_NAME = "pat.db";
private final static String DB_TABLE = "tests";
/* ------------------------------ Methods ------------------------------- */
And not as an Activity.
I'm not initializing the Class, and it has no constructor.
It's just a bin of shared (and not, for doing operations not seen anywhere else in my code) methods.
Solution 2
I would have all DB related methods in a singleton http://en.wikipedia.org/wiki/Singleton_pattern. I would send the context to that singleton, or just static methods.
I don't thnk its a good idea to have an activity as a database manager.
Magnus
Updated on July 16, 2020Comments
-
Magnus almost 4 years
I have an activity that contains all the functions for controlling my database, and I want all other activities to use to these functions when interacting with the database. Below is an example of my problem.
Clock script:
public class Clock extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_clock); Data.createTable(); //<<< } //... }
Data script:
public class Data extends Activity { SQLiteDatabase mydb; private static String DBNAME = "SHIFTS.db"; private static String TABLE = "MY_SHIFTS"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_data); } public void createTable() //<<< { try { mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null); mydb.execSQL("CREATE TABLE IF NOT EXISTS "+ TABLE +" (ID INTEGER PRIMARY KEY, STARTDATE TEXT, ENDDATE TEXT, LENGTH INTEGER, TYPE INTEGER);"); mydb.close(); } catch(Exception e) { Toast.makeText(getApplicationContext(), "Error in creating table", Toast.LENGTH_LONG).show(); } } // ... lots more functions }
Error message:
Cannot make a static reference to the non-static method createTable() from the type Data.
And when I trying to make method static, it just causes more problems.
Also if I try Data data = new Data(); data.createTable(); I get a NullPointerException.
What is the problem here?
-
Magnus over 10 yearsI tried this, but it gives a load of errors in regards to the functions within my SQLiteDatebase, eg: 'Cannot make a static reference to the non-static method openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory) from the type ContextWrapper'. Any ideas?
-
Swapnil over 10 yearsYes methods like openOrCreateDatabase() refers to activity Context,so you can add extra parameter context to the shared methods and call it from other activities passing current Activity Context.
-
Magnus over 10 yearsAh man, this is cool. Really similar to mine :P Could you show me how you set up your class containing the TableCreate function? Because I am still getting errors, and I think thats why.
-
Phantômaxx over 10 yearsSee my edited answer. I think now you have all you need to modify your code accordingly and start enjoying your db ;)
-
Magnus over 10 yearsCheers man, I finally figured out what was wrong with my database. I kept dropping the table when I shouldnt. Thanks for the help:)