5

Tôi muốn kiểm tra xem Cơ sở dữ liệu SQLite có đang mở hay không và nếu có, tôi muốn truy cập Cơ sở dữ liệu đó trong một lớp dịch vụ.Hoạt động và dịch vụ nền Truy cập cơ sở dữ liệu SQLite

Tôi lo lắng và đã thấy, nhiều cuộc gọi mở đến xung đột cơ sở dữ liệu và ném ngoại lệ. Bởi vì tôi truy vấn cơ sở dữ liệu trong cả hai lớp Hoạt động và Dịch vụ của mình, tôi đang cố triển khai giải pháp Commonsware được đề xuất ở đây: When to close db connection on android? Every time after your operation finished or after your app exit. Tuy nhiên, tôi không muốn đóng, sau đó mở Database trong lớp Service nếu Activity có thể cần nó. Từ câu trả lời này Why use SQLiteOpenHelper over SQLiteDatabase?, có vẻ như nó có thể có ý nghĩa để thực hiện một SQLiteOpenHelper để giải quyết vấn đề thực hiện nhiều cuộc gọi.

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn !!

Trả lời

5

Người đàn ông này Kevin là một huyền thoại: http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection. Cảm ơn bạn rất nhiều.

Mở liên kết mà ông chia sẻ giải pháp ridiculously đơn giản của mình:

public class DatabaseHelper extends OrmLiteSqliteOpenHelper { 
private static DatabaseHelper instance; 

    public static synchronized DatabaseHelper getHelper(Context context) 
    { 
     if (instance == null) 
      instance = new DatabaseHelper(context); 

     return instance; 
    } 
    //Other stuff... 
} 

Sau đó, trong lớp SQLite của tôi, tôi đã thay đổi mã của tôi trông như thế này:

public BlacklistWordDataSource(Context context) { 
    dbHelper = MySQLiteHelper.getHelper(context); 
} 
+8

Nó chỉ một mã singleton, tại sao phải rất thích thú về nó? –

+1

Một huyền thoại thực sự sẽ sử dụng một 'enum' cho điều này ... –

+3

Một huyền thoại thực sự không lo lắng về (hoặc cô) các nhà phê bình của mình. Dù sao, truyền thuyết vẫn tiếp tục: http://kpgalligan.tumblr.com/post/109546839958/single-database-connection. Nó chỉ là một tập hợp các liên kết về chủ đề. Nó cứ tiếp tục. –

-2

at onTạo hoạt động đặt datasource.open(); sau đó làm những gì mà bạn muốn và vào cuối actevity đặt này để đóng:

/** Call after close activity */ 
@Override 
protected void onStop() { 
    super.onStop(); 
    //Close dataSource 
    datasource.close(); 
} 
Các vấn đề liên quan