Calling function from another activity

47,123

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.

Share:
47,123
Magnus
Author by

Magnus

Updated on July 16, 2020

Comments

  • Magnus
    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
    Magnus over 10 years
    I 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
    Swapnil over 10 years
    Yes 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
    Magnus over 10 years
    Ah 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
    Phantômaxx over 10 years
    See my edited answer. I think now you have all you need to modify your code accordingly and start enjoying your db ;)
  • Magnus
    Magnus over 10 years
    Cheers man, I finally figured out what was wrong with my database. I kept dropping the table when I shouldnt. Thanks for the help:)