2012-04-10 124 views
2

Android系统是否自动关闭打开的SQLite数据库?我已经实现了一个用于访问数据的单例类,有时候这些方法需要在工作线程上运行。我有与在后台运行一个查询功能同步,这里的代码:Android:FC查询sqlite时打开数据库

public ArrayList<ActualCall> getUnsentCalls(boolean forUnsentSignature) { 
    ArrayList<ActualCall> calls = new ArrayList<ActualCall>(); 

    Cursor c; 
    open(); 

    if (forUnsentSignature) 
     c = db.rawQuery("SELECT * FROM " + TXN_ACTUAL_CALL_COMPONENT 
       + " WHERE sentFlag=1 and sigSentFlag=?", new String[] {"0"}); 
    else 
     c = db.rawQuery("SELECT * FROM " + TXN_ACTUAL_CALL_COMPONENT 
       + " WHERE sentFlag=? AND signature != ''", new String[] {"0"}); 

    if (c.moveToFirst()) { 
     do { 
      if (!db.isOpen()) 
       open(); 
      ActualCall call = new ActualCall(); 

      call.setAcpComponentId(c.getString(c.getColumnIndex("acpComponentId"))); 
      call.setAcpDate(c.getString(c.getColumnIndex("acpDate"))); 
      call.setAcpId(c.getString(c.getColumnIndex("acpId"))); 
      call.setCallEndTime(c.getString(c.getColumnIndex("callEndTime"))); 
      call.setCallStartTime(c.getString(c.getColumnIndex("callStartTime"))); 
      call.setCoordinates(c.getString(c.getColumnIndex("coordinates"))); 
      call.setDeviceTimestamp(c.getString(c.getColumnIndex("deviceTimestamp"))); 
      call.setDoctorId(c.getString(c.getColumnIndex("doctorId"))); 
      call.setSignature(c.getString(c.getColumnIndex("signature"))); 
      call.setSigSentFlag(c.getString(c.getColumnIndex("sigSentFlag"))); 
      call.setTimeSpent(c.getString(c.getColumnIndex("timeSpent"))); 
      call.setSentFlag(c.getString(c.getColumnIndex("sentFlag"))); 
      call.setCoordinates(c.getString(c.getColumnIndex("coordinates"))); 

      calls.add(call); 

     } while (c.moveToNext()); 
    } 

    c.close(); 
    db.close(); 

    return calls; 
} 

正如你所看到的,我已经叫open()的初始行还我收到讲述了一个错误我的数据库已经关闭。这里的堆栈跟踪:

java.lang.IllegalStateException: database  
/data/data/com.***.****/databases/****.db (conn# 0) already closed 
at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2123) 
at android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:398) 
at android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:390) 
at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:74) 
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:311) 
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:292) 
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:156) 
at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:233) 
at com.***.****.datalayer.ESCAndroidDataLayer.getUnsentCalls(ESCAndroidDataLayer.java:5340) 
at com.***.****.synchall.SynchAll$UnsentSignatureSender.run(SynchAll.java:1750) 

再次,上述方法调用一个Thread类,如果有帮助。我发现关于SQLite的链接被自动关闭,但我不明白他的解决方案:http://darutk-oboegaki.blogspot.com/2011/03/sqlitedatabase-is-closed-automatically.html

回答

0

尝试调用db.acquireReference() c.moveToFirst()

db.acquireReference(); 

    if (c.moveToFirst()) { 

或之前如果(db.isOpen())“简单地将db.close()用”“括起来就足够了。

if (db.isOpen()) 
    { 
     db.close(); 
    } 

我不太确定,但这些会改变一些东西。

+0

我有一个位置获取工作的背景,它提取一个位置,然后将其保存到数据库。我不确定如果这可能会影响我的其他数据库访问,如果它巧合同时发生。 – 2013-06-07 01:55:21