2013-01-06 32 views
7

Tôi có một cơ sở dữ liệu trung tâm trong ứng dụng của mình mà một vài hoạt động khác nhau cần truy cập.Android/Java: truy cập cùng một đối tượng DB SQLite từ nhiều hoạt động

Tôi có nên chia sẻ đối tượng này bằng cách đặt đối tượng tĩnh không? Ví dụ như trong các hoạt động mà khởi DB Tôi làm điều này:

protected static appDatabase db; 

Sau đó, những người khác có thể truy cập nó thông qua FirstActivity.db.

Một tùy chọn khác là tạo các đối tượng private appDatabase db trong mọi hoạt động cần nó, nhưng tôi nghi ngờ việc mở nhiều đối tượng db để truy cập cùng dữ liệu được lưu trữ có thể lãng phí.

Tuy nhiên tôi không biết nhiều về java, đó là lý do tôi hỏi - cách tốt nhất để làm điều này là gì và tại sao?

Cảm ơn

+0

Trong ứng dụng của tôi, tôi doesnt sử dụng tĩnh trên các đối tượng như vậy. Có lẽ nó thích, nhưng tôi đã không làm điều đó. Thú vị khi thấy những câu trả lời mà bạn nhận được. –

+0

Bạn có thể sử dụng một singleton? – fge

+0

Tôi thường làm việc với các cơ sở dữ liệu phía sau ContentProvider trong môi trường chuyên nghiệp của mình và tìm thấy rằng chỉ duy nhất một kết nối cơ sở dữ liệu tồn tại (sử dụng mẫu đơn như @fge gợi ý) giúp tôi giải quyết một số vấn đề nhất quán về dữ liệu và tránh sử dụng sai mục đích ngoại lệ ". Tôi tự hỏi làm thế nào các đối số giữ trong một môi trường không ContentProvider và do đó upvoted câu hỏi của bạn. Có lẽ người trả lời câu hỏi của bạn cũng có thể đề cập đến các lợi ích hiệu suất lớn mà chúng tôi có thể mong đợi với nhiều kết nối đơn lẻ như thế nào? : D – baske

Trả lời

4

Bạn có thể sử dụng singleton như thế này;

private static DataHelper singleton; 

    public static DataHelper getDataHelper(Context context) { 
      if (singleton == null) { 
        singleton = new DataHelper(context); 
        OpenHelper openHelper = new OpenHelper(singleton.context); 
        singleton.db = openHelper.getWritableDatabase(); 
      } 
      if(!singleton.db.isOpen()){ 
        OpenHelper openHelper = new OpenHelper(singleton.context); 
        singleton.db = openHelper.getWritableDatabase(); 
      } 
      singleton.context = context; 
      return singleton; 
    } 

    private DataHelper(Context context) { 
     this.context = context; 
} 

Và gọi lớp singleton của bạn như thế này;

public DataHelper dh; 
this.dh = DataHelper.getDataHelper(this); 
1

Tôi xử lý tình huống này bằng cách sử dụng lớp Ứng dụng và quản lý đối tượng cơ sở dữ liệu được đồng bộ hóa. Đây là một ví dụ. Bộ định danh [được đồng bộ] là khóa trong một ứng dụng đa luồng.

Theo định nghĩa đối tượng Ứng dụng là Singleton trong Android.

public class App extends Application 
{ 

private static App _instance; 
private AppLocalStorage _localStorage; 

@Override 
public void onCreate() 
{ 
    super.onCreate(); 

    _instance = this; 
} 


public static App getInstance() 
{ 
     //Exposes a mechanism to get an instance of the 
     //custom application object. 
     return _instance; 
} 

public synchronized AppLocalStorage getDatabase() 
{ 
    if (_localStorage == null) 
    { 
     _localStorage = new AppLocalStorage(this); 
    } 

    return _localStorage; 
} 

}

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