2015-02-25 2 views
-2

У меня есть «приложение», в котором есть вкладка с тремя вкладками:
В первую очередь я пытаюсь получить некоторые строки из базы данных SQLite и показать их в ListView.Получение контекста из фрагмента расширенной активности

Класс которые обрабатывают расположение вкладок называется PageFragment:

public class PageFragment extends Fragment { 
    public static final String ARG_PAGE = "ARG_PAGE"; 

    private int mPage; 
    public MainActivity Main; 

    public static PageFragment newInstance(int page) { 
     Bundle args = new Bundle(); 
     args.putInt(ARG_PAGE, page); 
     PageFragment fragment = new PageFragment(); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mPage = getArguments().getInt(ARG_PAGE); 
    } 

    ListView ItemsLst; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = null; 
     switch(mPage) 
     { 
      case 1: 
       view = inflater.inflate(R.layout.layout_schedule, container, false); 

       DatabaseHandler db = new DatabaseHandler(getActivity().getApplicationContext()); 

       Medicine med = new Medicine("Cardioaspirina", "Pillola", 1, "2015-02-25", "12:00:00"); 

       db.AddMedicine(med); 

       ScheduleList(view, db.GetAllMedicines()); 

       return view; 
      case 2: 
       view = inflater.inflate(R.layout.layout_settings, container, false); 
       return view; 
      case 3: 
       view = inflater.inflate(R.layout.layout_info, container, false); 
       return view; 
     } 
     return view; 
    } 

    public void ScheduleList(View v, List<Medicine> medicines) { 
     ItemsLst = (ListView) v.findViewById(R.id.listview); 
     ArrayAdapter<Medicine> adapter = new ArrayAdapter<Medicine>(getActivity(), android.R.layout.simple_list_item_1, medicines); 
     ItemsLst.setAdapter(adapter); 
    } 
} 

Как вы можете видеть, в методе onCreateView() я управлять размещением вкладок. Для извлечения данных из базы данных я создал класс с именем DatabaseHandler, который имеет такие методы, как AddRecord, GetRecord, GetAllRecords и т.д. Вопрос заключается в том, что DatabaseHandler конструктор нуждается в Context переменном, и я попытался дать ему контекст с помощью:

DatabaseHandler db = new DatabaseHandler(getActivity().getApplicationContext()); 

Я также пытался использовать только getActivity(), но это бросает мне NullPointerException.

Если полезно, вот DatabaseHandler конструктор:

public DatabaseHandler(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

Так кто-нибудь знает, как получить контекст приложения из PageFragment класса? Заранее спасибо!

P.S. Вот трассировки стека:

02-25 21:04:52.588 1947-1947/com.mms.dailypill I/art﹕ Not late-enabling -Xcheck:jni (already on) 
02-25 21:04:53.092 1947-1959/com.mms.dailypill I/art﹕ Background sticky concurrent mark sweep GC freed 2943(255KB) AllocSpace objects, 0(0B) LOS objects, 29% free, 796KB/1135KB, paused 30.424ms total 49.618ms 
02-25 21:04:53.093 1947-1972/com.mms.dailypill D/OpenGLRenderer﹕ Render dirty regions requested: true 
02-25 21:04:53.094 1947-1947/com.mms.dailypill D/﹕ HostConnection::get() New Host Connection established 0xa6840570, tid 1947 
02-25 21:04:53.106 1947-1947/com.mms.dailypill D/Atlas﹕ Validating map... 
02-25 21:04:53.125 1947-1947/com.mms.dailypill E/SQLiteLog﹕ (1) near "TABLEDailyPill": syntax error 
02-25 21:04:53.125 1947-1947/com.mms.dailypill D/AndroidRuntime﹕ Shutting down VM 
02-25 21:04:53.183 1947-1947/com.mms.dailypill E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.mms.dailypill, PID: 1947 
    android.database.sqlite.SQLiteException: near "TABLEDailyPill": syntax error (code 1): , while compiling: CREATE TABLEDailyPill(id INTEGER AUTOINCREMENT, name VARCHAR(50), format VARCHAR(15), amount INTEGER, exp_dateDATE, time HOUR, PRIMARY KEY(id)); 
      at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
      at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) 
      at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) 
      at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
      at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
      at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
      at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674) 
      at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1605) 
      at com.mms.dailypill.DatabaseHandler.onCreate(DatabaseHandler.java:63) 
      at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:251) 
      at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 
      at com.mms.dailypill.DatabaseHandler.AddMedicine(DatabaseHandler.java:84) 
      at com.mms.dailypill.PageFragment.onCreateView(PageFragment.java:48) 
      at android.support.v4.app.Fragment.performCreateView(Fragment.java:1786) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126) 
      at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739) 
      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489) 
      at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:486) 
      at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:1073) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:919) 
      at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1441) 
      at android.view.View.measure(View.java:17430) 
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:875) 
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 
      at android.view.View.measure(View.java:17430) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 
      at android.view.View.measure(View.java:17430) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 
      at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:453) 
      at android.view.View.measure(View.java:17430) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 
      at android.view.View.measure(View.java:17430) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 
      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 
      at android.view.View.measure(View.java:17430) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560) 
      at android.view.View.measure(View.java:17430) 
      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001) 
      at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1166) 
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1372) 
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054) 
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
      at android.view.Choreographer.doCallbacks(Chor 
02-25 21:04:55.795 1947-1947/com.mms.dailypill I/Process﹕ Sending signal. PID: 1947 SIG: 9 
+0

Контекст больше не вызывает проблем ... но я просто прочитал, что ошибка дается SQL. Я добавлю класс базы данных к вопросу. –

ответ

1

Во-первых, не используйте getApplicationContext() по причине, объяснить в этой теме:

When to call activity context OR application context?

И для вас вопрос о том, как получить контекст в вашем фрагменте создает глобальную переменную:

private Context context; 

//onCreate method 
context = this; 

Используйте этот контекст для создания метода просмотра.

Последняя вещь, я не думаю, что ваша проблема с контекстом, но с созданием базы данных, так как журнал ясно, состояние есть проблема вблизи «TABLEDailyPill»: Я думаю, что ваш запрос должен быть фикс.

0
android.database.sqlite.SQLiteException: near "TABLEDailyPill": syntax error (code 1): , while compiling: CREATE TABLEDailyPill(id INTEGER AUTOINCREMENT, name VARCHAR(50), format VARCHAR(15), amount INTEGER, exp_dateDATE, time HOUR, PRIMARY KEY(id)); 

У вас не хватает места между TABLE и DailyPill, предполагая, что DailyPill должно быть имя таблицы.

+0

Я совершил огромную ошибку, заменив имя TABLE именем DATABASE, а также пробелом после TABLE, но это не проблема ... –

+0

@FedericoBelotti: Если вы прочитали сообщение об ошибке, ему очень просто не хватает пробела между ' TABLE' и 'DailyPill'. Следовательно, это определенно «проблема» для этой трассировки стека. – CommonsWare

+0

Я редактирую запрос и добавляю пространство, и теперь стек говорит: '02-25 21: 42: 24.721 1895-1895/com.mms.dailypill E/SQLiteLog: (1) нет такой таблицы: Лекарства 02-25 21: 42: 24,722 1895-1895/com.mms.dailypill E/SQLiteDatabase: Ошибка ввода имени = Cardioaspirina amount = 1 раз = 12: 00: 00 format = Pillola exp_date = 2015-02-25 android.database.sqlite.SQLiteException: нет такой таблицы: Лекарства (код 1):, при компиляции: INSERT INTO Medicines (имя, сумма, время, формат, exp_date) VALUES (?,?,?,?,?) ' –

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