从未在数据库上显式调用Android Close()

时间:2014-04-16 15:23:26

标签: java android sqlite

我不断收到错误消息Close() was never explicitly called on database。据我所知,一旦活动被销毁,我就不会关闭数据库,但我不知道如何实现它:

数据库助手:

public class ResultsDatabase extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "results.db";
private static final int DATABASE_VERSION = 2;

public static final String TABLE_NAME = "results";
public static final String _ID = BaseColumns._ID;
public static final String SAVED_NAME = "name";
public static final String COLUMN_NAME_CREATE_DATE = "date";
public static final String RIGHT_EAR = "right_ear";
public static final String LEFT_EAR = "left_ear";

public ResultsDatabase(Context context) {
    // calls the super constructor, requesting the default cursor factory.
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE " + TABLE_NAME + " ("
            + _ID + " INTEGER PRIMARY KEY,"
            + SAVED_NAME + " TEXT,"
            + COLUMN_NAME_CREATE_DATE + " INTEGER,"
            + RIGHT_EAR + " BLOB,"
            + LEFT_EAR + " BLOB"
            + ");");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
}

public void storeResults(String name, List<EarSrt> leftAnswerList, List<EarSrt> rightAnswerList){
    SQLiteDatabase db = getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(SAVED_NAME, name);
    Long now = Long.valueOf(System.currentTimeMillis());
    values.put(COLUMN_NAME_CREATE_DATE, now);
    values.put(RIGHT_EAR, serializeObject(rightAnswerList ));
    values.put(LEFT_EAR, serializeObject(leftAnswerList ));
    db.insert(TABLE_NAME, null, values);
}

public static byte[] serializeObject(Object o) { 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

    try { 
        ObjectOutput out = new ObjectOutputStream(bos); 
        out.writeObject(o); 
        out.close(); 

        // Get the bytes of the serialized object 
        byte[] buf = bos.toByteArray(); 

        return buf; 
    } catch(IOException ioe) { 
        Log.e("serializeObject", "error", ioe); 

        return null; 
    } 
}

public static Object deserializeObject(byte[] b) { 
    try { 
        ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(b)); 
        Object object = in.readObject(); 
        in.close(); 

        return object; 
    } catch(ClassNotFoundException cnfe) { 
        Log.e("deserializeObject", "class not found error", cnfe); 

        return null; 
    } catch(IOException ioe) { 
        Log.e("deserializeObject", "io error", ioe); 

        return null; 
    } 
} 
}

我在Tabbed Results Activity中调用此帮助程序,该活动以两个不同的片段显示数据,如下所示:

public class TabbedResultsActivity extends SherlockFragmentActivity{
TabHost mTabHost;
TabManager mTabManager;
public static final String IS_RIGHT_EAR = "is_right_ear";
private ArrayList<EarSrt> leftAnswerList;
private ArrayList<EarSrt> rightAnswerList;

private final static String TAG = "HearingTest";

private boolean isRightEarTab = true;

private boolean bothEarsBad;
private boolean leftEarBad;
private boolean rightEarBad;

@SuppressWarnings("unchecked")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.tab_layout);

    ActionBar ab = this.getSupportActionBar();
    SherlockHelper.setupActionBar(ab, this);

    View infoButton = findViewById(R.id.info_button);
    infoButton.setVisibility(View.VISIBLE);

    Intent intent = getIntent();
    int rowId = intent.getIntExtra(ResultsDatabase._ID, -1);
    if ( rowId != -1 ) {
        ResultsDatabase db = new ResultsDatabase(this);
        String select = "(" + ResultsDatabase._ID + " == " + rowId + ")";
        Cursor c = db.getReadableDatabase().query(ResultsDatabase.TABLE_NAME, null, select, null, null, null,null);
        if ( c.moveToFirst() ) {
            int leftEarColumn = c.getColumnIndex(ResultsDatabase.LEFT_EAR);
            byte[] leftEarByteArray = c.getBlob(leftEarColumn);
            int rightEarColumn = c.getColumnIndex(ResultsDatabase.RIGHT_EAR);
            byte[] rightEarByteArray = c.getBlob(rightEarColumn);
            leftAnswerList = (ArrayList<EarSrt>) ResultsDatabase.deserializeObject(leftEarByteArray);
            rightAnswerList = (ArrayList<EarSrt>) ResultsDatabase.deserializeObject(rightEarByteArray);
        }

    } else {
        byte[] leftEarByteArray = getIntent().getByteArrayExtra(ResultsDatabase.LEFT_EAR);
        byte[] rightEarByteArray = getIntent().getByteArrayExtra(ResultsDatabase.RIGHT_EAR);
        leftAnswerList = (ArrayList<EarSrt>) ResultsDatabase.deserializeObject(leftEarByteArray);
        rightAnswerList = (ArrayList<EarSrt>) ResultsDatabase.deserializeObject(rightEarByteArray);
    }

    isRightEarTab = getIntent().getBooleanExtra(IS_RIGHT_EAR, true);

    GraphView graphView = new GraphView(this);

                graphView.setPoints(rightAnswerList);
                float leftAverage = calculateAverage(rightAnswerList);
                graphView.setAverage(leftAverage);

                graphView.setPoints(leftAnswerList);
                float rightAverage = calculateAverage(leftAnswerList);
                graphView.setAverage(rightAverage);

    setResults(leftAnswerList, rightAnswerList);

    String results = setResultCaption(bothEarsBad, leftEarBad, rightEarBad).toString();

        Log.d(TAG, "The results were " + results);

        Bundle leftbundle = new Bundle();
        leftbundle.putString("results", results);
        leftbundle.putParcelableArrayList("graph", leftAnswerList);
        leftbundle.putFloat("average", leftAverage);

        Bundle rightbundle = new Bundle();
        rightbundle.putString("results", results);
        rightbundle.putParcelableArrayList("graph", rightAnswerList);
        rightbundle.putFloat("average", rightAverage);

    mTabHost = (TabHost)findViewById(android.R.id.tabhost);
    mTabHost.setup();

    mTabManager = new TabManager(this, mTabHost, R.id.realtabcontent);

    mTabManager.addTab(mTabHost.newTabSpec(getString(R.string.Left_ear)).setIndicator(getString(R.string.Left_ear)),
            LeftEarResults.class, leftbundle);
    mTabManager.addTab(mTabHost.newTabSpec("contacts").setIndicator(getString(R.string.Right_ear)),
            RightEarResults.class, rightbundle);

    if (savedInstanceState != null) {
        mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("tab", mTabHost.getCurrentTabTag());
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    return MenuActivity.createMenu(this, menu);
}

private float calculateAverage(List<EarSrt> steps) {
    float srt = 0.0f;
    int length = steps.size();

    for (int i = (int)Math.ceil( (float)length/(float)2); i < length; i++) {
        EarSrt es = steps.get(i);
        srt += es.getSrt();
    }       
    srt = srt / (length-(float)Math.ceil( (float)length/(float)2));

    return srt;
}

private void setResults(List<EarSrt> leftEar, List<EarSrt> rightEar) {
    float esLeft = calculateAverage(leftEar);
    float esRight = calculateAverage(rightEar);

    leftEarBad = (esLeft > 24.0);
    rightEarBad = (esRight > 24.0);
    bothEarsBad = (leftEarBad && rightEarBad);
}

private StringBuilder setResultCaption(boolean bothEarsBad, boolean leftEarBad, boolean rightEarBad) {
    String resultCaption;
    StringBuilder resultsText = new StringBuilder();
    if (bothEarsBad) {
        resultsText.append(getString(R.string.The_test_indicates_a_possible_hearing_loss));
        resultsText.append(getString(R.string.We_recommend_that_you_visit_a_Hearing_Care_Professional_for_a_comprehensive_hearing_check));
    }else{
        if (leftEarBad) {
            resultsText.append(getString(R.string.The_test_indicates_a_possible_hearing_loss_for_your_left_ear));
            resultsText.append(getString(R.string.We_recommend_that_you_visit_a_Hearing_Care_Professional_for_a_comprehensive_hearing_check));
        } else if (rightEarBad) {
            resultsText.append(getString(R.string.The_test_indicates_a_possible_hearing_loss_for_your_Right_ear));
            resultsText.append(getString(R.string.We_recommend_that_you_visit_a_Hearing_Care_Professional_for_a_comprehensive_hearing_check));      
        }else {
            resultsText.append(getString(R.string.There_is_no_indication_of_hearing_loss));
        }                               
    }

    resultsText.append(getString(R.string.The_results_of_the_hearing_test_are_not_to_be_utilized_as_an_official_outcome_for_assessing_levels_of_hearing_loss_True_hearing_loss_assessments_can_only_be_determined_by_a_licensed_hearing_healthcare_provider));                                  

    Log.d(TAG, "The results were " + resultsText);

    return resultsText;
}

public void infoView(View aView) {
    Intent intent = new Intent(this, InfoActivity.class);
    startActivity(intent);
}
}

我的问题是我应该如何以及在哪里关闭连接?

由于

1 个答案:

答案 0 :(得分:2)

只需更改storeResults方法,如下所示

public void storeResults(String name, List<EarSrt> leftAnswerList, List<EarSrt> rightAnswerList){
    SQLiteDatabase db = getWritableDatabase(); // opens the database connection
    try {
        ContentValues values = new ContentValues();
        values.put(SAVED_NAME, name);
        Long now = Long.valueOf(System.currentTimeMillis());
        values.put(COLUMN_NAME_CREATE_DATE, now);
        values.put(RIGHT_EAR, serializeObject(rightAnswerList ));
        values.put(LEFT_EAR, serializeObject(leftAnswerList ));
        db.insert(TABLE_NAME, null, values);
    }
    catch(Exception e) {
        e.printStackTrace();
        // furher error handling
    }
    finally {
        db.close(); // closes the database every time after access
    }
}