2014-01-18 5 views
4

У меня есть активность, которая содержит все функции для управления моей базой данных, и я хочу, чтобы все другие действия использовались для этих функций при взаимодействии с базой данных. Ниже приведен пример моей проблемы.Функция вызова из другого вида деятельности

часы сценария: сценарий

public class Clock extends Activity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_clock); 

     Data.createTable(); //<<< 
    } 
     //... 
} 

данных: сообщение

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 
} 

Ошибка:

Не удается сделать статическую ссылку на не-STA tic метод createTable() от типа данных.

И когда я пытаюсь сделать метод статическим, это просто вызывает больше проблем.

Также, если я пытаюсь Data data = new Data(); data.createTable(); Я получаю исключение NullPointerException.

В чем проблема?

+0

Объявите класс данных как статический – user2511882

+0

Проверьте это [ссылка] (http://www.intertech.com/Blog/androids-application-class/) – amalBit

ответ

12

Добавьте статическую ключевое слово в общие методы

public static void createTable() 

Затем используют:

Data.createTable(); 

где-то в другом классе/Фрагмент/Activity.

Я так и делаю.

Ну, мои «данные» являются нормальным классом, а не активностью, но у меня также есть действие с общими методами таким же образом.

Это мой метод dbTableCreate:

// 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(); 
    } 
} 

И я называю это нравится:

Context ctx = getApplicationContext(); 
CLS_DB.dbTableCreate(ctx); 

Основное различие между моим классом и ваша в том, что шахта объявлена ​​как

public final class CLS_DB 
{ 
    /* ----------------------------- Constants ------------------------------ */ 

    private final static String DB_NAME = "pat.db"; 
    private final static String DB_TABLE = "tests"; 

    /* ------------------------------ Methods ------------------------------- */ 

И не как активность.
Я не инициализирую класс, и у него нет конструктора.
Это всего лишь мусор из общего (а не для выполнения операций, которые не видели нигде в моем коде).

+1

Я пробовал это, но он дает нагрузку ошибок в отношении функций в моей SQLiteDatebase, например: «Невозможно сделать статическую ссылку на нестатический метод openOrCreateDatabase (String, int, SQLiteDatabase.CursorFactory) из типа ContextWrapper». Есть идеи? – Magnus

+0

Такие методы, как openOrCreateDatabase(), относятся к активности Контекст, поэтому вы можете добавить дополнительный контекст параметра к совместно используемым методам и вызвать его из других действий, проходящих текущий контекст активности. – Swapnil

+0

А человек, это круто. Действительно похоже на мое: P Не могли бы вы показать мне, как вы создали свой класс, содержащий функцию TableCreate? Потому что я все еще получаю ошибки, и я думаю, именно поэтому. – Magnus

2

У меня были бы все методы, связанные с БД, в одноэлементном http://en.wikipedia.org/wiki/Singleton_pattern. Я бы послал контекст этому одиночному тону, или просто статическим методам.

Я не хочу, чтобы его работа была как менеджер баз данных.

0

Лучший способ с java-стандартом - создать базу данных Singleton class.Поместите все эти общие методы в этот класс. Все действия в вашем приложении будут выполнять операции с базой данных, используя этот класс Singleton.

-2

я следовал этот вопрос и на основе ответа на Android_Dev я внес изменения в свой код, как показано ниже

1-го класса

class blah extends activity { 
//// onCreate , initialization etc here 

    public void sss(context c) 
    { 

    Toast(c , "text" , toast.LENTGH_LONG) ; 

    } 

    } 

второго класса

public xxxx extends activity 
{ 

Context c = getApplicationContext(); 
blah b = new blah(this) ; 

/// inside an onclicklistener attached to a button object, i put this 
    b.sss(c) ; 

} 

Я не включил все другие вещи, обычно встречающиеся в классах, расширяющих класс Activity, так как я просто хотел показать, что я сделал, чтобы вызвать функцию из другого класса. Это решение было идеально для меня. Может или не может быть полезным для других, но

Смежные вопросы