Доступ к базе данных Android через вкладки - PullRequest
0 голосов
/ 23 июля 2010

У меня есть четыре вкладки (отчеты, обзоры отчетов, карта и настройки).У меня есть база данных 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]

Идеи?

1 Ответ

1 голос
/ 23 июля 2010

Вы пытаетесь открыть базу данных несколько раз. Используйте один объект ReportDatabase, доступный через статический метод ReportDatabase. Примерно так:

class ReportDatabase
{
    static ReportDatabase TheDatabase = null;

    static ReportDatabase Open(Context c)
    {
        if(TheDatabase == null)
            TheDatabase = new ReportDatabase(c);
        return TheDatabase;
    }
}

Это часто называют синглтоном. Или глобальный:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...