2012-02-19 33 views
9

Tôi đang viết một ứng dụng quản lý mua sắm Android và đã gặp lỗi khi cố gắng đóng một trong các bảng cơ sở dữ liệu SQLite của mình.Ngoại lệ cho SQLite của Android: không thể đóng do tuyên bố không được khai báo

ItemsDb idb = new ItemsDb(this); 

idb.open(); 

ArrayList<String> itemNames = idb.getItemNames(); 

for(int i=0; i < itemNames.size(); i++){ 

    String itemName = itemNames.get(i); 

    String itemID = idb.getItemID(itemName); 
    String itemName = idb.getItemNames().get(i); 
    String itemPrices = idb.getItemPrices().get(i); 
    String itemQuantity = idb.getItemQuantities().get(i);    
    String dateBought = idb.getDateBought(itemName);  
    String decayRate = idb.getDecayRate(itemName); 
    String decayType = idb.getDecayType(itemName); 
    String lastDecay = idb.getLastDecay(itemName); 
    String prevQuantity = idb.getPreviousQuantity(itemName); 
} 

idb.close(); 

này không xảy ra với các cuộc gọi khác đến lớp này như vậy và tôi tự hỏi nếu nó là bởi vì có một vòng lặp với rất nhiều cuộc gọi đến các cơ sở dữ liệu ở đây. Lỗi là SQLite Exception: unable to close due to unfinalised statements.

Dòng lỗi từ lớp "ItemsDb" là ở đây

public ItemsDb(Context c){ 

     ourContext = c; 
    } 

    public ItemsDb open() throws SQLException{ 
     ourHelper = new DbHelper(ourContext); 
     ourDatabase = ourHelper.getWritableDatabase(); 
     return this; 
    } 

    public void close(){ 
     ourHelper.close(); 
    } 

Rõ ràng SQLite3 có một phương thức Finalize để phá hủy cuộc gọi DB trước nhưng tôi không chắc chắn làm thế nào để thực hiện điều này hoặc thậm chí nếu nó là cần thiết ở đây.

Bất kỳ trợ giúp nào về điều này đều tuyệt vời.

+0

Bạn có đang sử dụng bất kỳ con trỏ nào trong báo cáo của mình không? – Jivings

Trả lời

6

Có vẻ như vấn đề liên quan đến con trỏ, nhờ Jivings. Tôi đã không đóng con trỏ sau khi tôi truy vấn cơ sở dữ liệu, có nghĩa là các tham chiếu nhất định tới cơ sở dữ liệu không hợp lệ.

public String getName(String id) throws SQLException{ 
    String[] columns = new String[]{ KEY_ItemID, KEY_NAME}; 
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ItemID + "='" + id + "'", null, null, null, null); 
    if(c != null){ 
     c.moveToFirst(); 
     String name = c.getString(1); 
     c.close(); 
     return name; 
    } 
    return null; 
} 

Gọi "c.close" có vẻ như là lừa.

Các vấn đề liên quan