У меня есть четыре вкладки (отчеты, обзоры отчетов, карта и настройки).У меня есть база данных sqlite, заполненная информацией отчета.Я хочу, чтобы база данных была доступна во всем приложении.Вкладка «Отчеты» успешно добавляет данные в базу данных, однако при использовании той же методики происходит сбой приложения.Отладчик Android указывает на строку, где база данных вызывается снова.
На вкладке отчетов следующий код используется для запуска базы данных ...
this.reportDatabase = new ReportDatabase(this);
this.reportDatabase.insert("(" + latitude + ", " + longitude + ", " + time + ", '" + spinnerState + "', " + lower + ", " + upper + ", " + agreed + ", " + getAlgorithmCount() + ", " + xAxis + ", " + yAxis + ", " + zAxis + ", " + altitude + ", "+ accuracy + ", 'photo');");
В onCreate ()метод вкладки «Просмотр» - где я хочу просмотреть отчеты - я пытаюсь получить доступ к базе данных с помощью вызова, вызывающего метод возврата отчета
this.reportDatabase = new ReportDatabase (this);
Однако это не работает.В отладчике Android подчеркивается, что проблема связана с предоставляемым ему контекстом.Я понимаю, что к базе данных отчетов уже обращались с помощью вкладки отчетов, и мне интересно, не вызывает ли это проблему.Я новичок в программировании Android, приложение предназначено для сообщения о фламинго в Африке, любая помощь будет принята с благодарностью!
Следуя совету Сева Алексеева, я адаптировался следующим образом ...
Я адаптировал свою базу данных отчетов как ...
public ReportDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
ReportDatabase.context = context;
OpenHelper openHelper = new OpenHelper(ReportDatabase.context);
this.database = openHelper.getWritableDatabase();
}
static ReportDatabase open(Context c){
if(reportDatabase == null){
reportDatabase = new ReportDatabase(ReportDatabase.context);
return reportDatabase;
}
return reportDatabase;
}
, используя ...
reportDatabase = ReportDatabase.open(this);
В качестве вызова на вкладке отчета и обзора.К сожалению, это не работает, отладчик останавливается на том же методе.Полный файл ReportDatabase.java находится здесь ...
package com.android.flamingo;
import java.util.Vector;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class ReportDatabase extends SQLiteOpenHelper {
private static Context context;
private SQLiteDatabase database;
static ReportDatabase reportDatabase;
private static final String DATABASE_NAME = "flamingo_reports";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_NAME = "reports";
/**
* Default (and only) constructor....
*
* @param context
*/
public ReportDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
ReportDatabase.context = context;
OpenHelper openHelper = new OpenHelper(ReportDatabase.context);
this.database = openHelper.getWritableDatabase();
}
static ReportDatabase open(Context c){
if(reportDatabase == null){
reportDatabase = new ReportDatabase(ReportDatabase.context);
return reportDatabase;
}
return reportDatabase;
}
/**
*
* @param name
*/
public void insert(String name){
this.database.execSQL("INSERT INTO " + TABLE_NAME + "(latitude, longitude, time, lake, lower_estimate, higher_estimate, agreed_estimate, algorithm_count, xaxis, yaxis, zaxis, altitude, accuracy, photo_identifier) VALUES " + name);
}
/**
* This method returns a double array and probably shouldn't be this hacky...
*
*
* @return
*/
public Vector<ReportInstanceQuery> reportSelect(){
Vector<ReportInstanceQuery> tempReports = new Vector<ReportInstanceQuery>();
Cursor c = database.rawQuery("SELECT id,time,lake,lower_estimate,higher_estimate,agreed_estimate,algorithm_count FROM" + TABLE_NAME + ";",null);
int indexTime = c.getColumnIndex("time");
int indexLake = c.getColumnIndex("lake");
int indexLowerEstimate = c.getColumnIndex("lower_estimate");
int indexHigherEstimate = c.getColumnIndex("higher_estimate");
int indexAgreedEstimate = c.getColumnIndex("agreed_estimate");
int indexAlgorithmCount = c.getColumnIndex("algorithm_count");
if (c != null){
int i = 0;
do {
i++;
int columnTime = c.getInt(indexTime);
String columnLake = c.getString(indexLake);
int columnLowerEstimate = c.getInt(indexLowerEstimate);
int columnHigherEstimate = c.getInt(indexHigherEstimate);
int columnAgreedEstimate = c.getInt(indexAgreedEstimate);
int columnAlgorithmCount = c.getInt(indexAlgorithmCount);
tempReports.add(new ReportInstanceQuery(columnTime, columnLake, columnLowerEstimate, columnHigherEstimate, columnAgreedEstimate, columnAlgorithmCount));
} while (c.moveToNext());
}
reportDatabase.close();
return tempReports;
}
/**
* This method connects to the database
*
*/
public void CSVReportSelect(){
}
public void delete(){
this.database.delete(TABLE_NAME, null, null);
}
@Override
public void onCreate(SQLiteDatabase database) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
private static class OpenHelper extends SQLiteOpenHelper {
OpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY AUTOINCREMENT, latitude REAL, longitude REAL, time INTEGER, lake TEXT, lower_estimate INTEGER, higher_estimate INTEGER, agreed_estimate INTEGER, algorithm_count INTEGER, xaxis REAL, yaxis REAL, zaxis REAL, altitude REAL, accuracy REAL, photo_identifier TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w("Example", "Upgrading database, this will drop tables and recreate.");
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
}
Со стеком ошибок ...
ReportDatabase.<init>(Context) line: 29
ReportDatabase.open(Context) line: 37
ReviewTab.onCreate(Bundle) line: 26
Instrumentation.callActivityOnCreate(Activity, Bundle) line: 1123
ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord) line: 2231
ActivityThread.startActivityNow(Activity, String, Intent, ActivityInfo, IBinder, Bundle, Object) line: 2112
LocalActivityManager.moveToState(LocalActivityManager$LocalActivityRecord, int) line: 130
LocalActivityManager.startActivity(String, Intent) line: 342
TabHost$IntentContentStrategy.getContentView() line: 600
TabHost.setCurrentTab(int) line: 310
TabHost$2.onTabSelectionChanged(int, boolean) line: 126
TabWidget$TabClickListener.onClick(View) line: 268
RelativeLayout(View).performClick() line: 2183
RelativeLayout(View).onTouchEvent(MotionEvent) line: 3849
RelativeLayout(View).dispatchTouchEvent(MotionEvent) line: 3389
RelativeLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 831
TabWidget(ViewGroup).dispatchTouchEvent(MotionEvent) line: 863
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 863
TabHost(ViewGroup).dispatchTouchEvent(MotionEvent) line: 863
FrameLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 863
LinearLayout(ViewGroup).dispatchTouchEvent(MotionEvent) line: 863
PhoneWindow$DecorView(ViewGroup).dispatchTouchEvent(MotionEvent) line: 863
PhoneWindow$DecorView.superDispatchTouchEvent(MotionEvent) line: 1707
PhoneWindow.superDispatchTouchEvent(MotionEvent) line: 1197
HelloFlamingos(Activity).dispatchTouchEvent(MotionEvent) line: 1993
PhoneWindow$DecorView.dispatchTouchEvent(MotionEvent) line: 1691
ViewRoot.handleMessage(Message) line: 1525
ViewRoot(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 123
ActivityThread.main(String[]) line: 3948
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
ZygoteInit$MethodAndArgsCaller.run() line: 782
ZygoteInit.main(String[]) line: 540
NativeStart.main(String[]) line: not available [native method]
Идеи?