मैं अपने एंड्रॉइड अनुप्रयोगों में स्थानीय डेटाबेस पहुंच को संभालने का सबसे अच्छा तरीका जानने का प्रयास कर रहा हूं। मैं प्रत्येक गतिविधि में डेटाबेस कनेक्शन ऑब्जेक्ट बना रहा था लेकिन यह चीजों को करने के लिए वास्तव में अक्षम तरीके जैसा लगता है। कुछ शोध करना मैंने this discussion पर ठोकर खाई। सेवा का उपयोग करना चीजों को करने का एक शानदार तरीका है, लेकिन मुझे इसे काम करने में परेशानी हो रही है।एंड्रॉइड ऐप में सभी गतिविधियों के बीच डेटाबेस कनेक्शन साझा करने के लिए एक सेवा बनाना?
सेवा:
public class DBservice extends Service {
private final static String TAG = "net.iamcorbin.frolfcard";
public DBconn db;
private DBbinder mDatabaseBinder = new DBbinder();
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG,"DBservice : onCreate");
mDatabaseBinder.mDatabaseService = this;
this.db = new DBconn(getApplicationContext());
this.db.open();
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG,"DBservice : onBind");
return mDatabaseBinder;
}
@Override
public int onStartCommand(Intent intent, int flags, int startID) {
Log.d(TAG,"DBservice : onStartCommand");
return Service.START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG,"DBservice : onDestroy");
mDatabaseBinder.mDatabaseService = null;
this.db.close();
}
}
बांधने की मशीन:
public class DBbinder extends Binder {
public DBservice mDatabaseService;
public DBconn getDB() {
return mDatabaseService.db;
}
}
सेवा कनेक्शन:
public class DBserviceConn implements ServiceConnection {
private final static String TAG = "net.iamcorbin.frolfcard";
DBbinder mBinder;
public DBserviceConn(DBbinder binder) {
Log.d(TAG,"DBseviceConn : Constructor");
this.mBinder = binder;
}
public void onServiceConnected(ComponentName className, IBinder binder) {
Log.d(TAG,"DBseviceConn : OnServiceConnected");
this.mBinder = (DBbinder) binder;
}
public void onServiceDisconnected(ComponentName arg0) {
Log.d(TAG,"DBseviceConn : OnServiceDisconnected");
}
}
तक पहुँचने:
यहाँ मैं क्या हैprivate DBbinder dbBinder;
private DBserviceConn dbServiceConn;
//In onCreate() for Activity that wants to access database
//Setup DB Service Connection and Binder
this.dbServiceConn = new DBserviceConn(this.dbBinder);
final Intent i_DBservice = new Intent(PickGame.this, DBservice.class);
//bind DB Service
this.bindService(i_DBservice, this.dbServiceConn, BIND_AUTO_CREATE);
यह किसी भी त्रुटि फेंक बिना निष्पादित करता है लेकिन जब मैं कोशिश करते हैं और साथ डेटाबेस का उपयोग करें:
this.dbServiceConn.mBinder.mDatabaseService.db.queryPlayers();
यह एक NullPointerException फेंकता है। चर्चा (उपरोक्त लिंक) पढ़ने से मुझे लगता है कि ऐसा इसलिए है क्योंकि डेटाबेस अभी तक खुला नहीं है क्योंकि मैं bindService के बाद तुरंत पूछताछ कर रहा हूं। हालांकि सूची सूची को पॉप्युलेट करने के लिए मुझे डेटाबेस का उपयोग करने की आवश्यकता है।
तो सवाल
1. क्या मैं सेवा, बांधने वाला और सेवा कनेक्शन ठीक से बना रहा हूं?
2. यदि हां, तो सेवा शुरू होने, बाध्य होने और डेटाबेस खोले जाने के बाद मैं सूची दृश्य को पॉप्युलेट करने के लिए कॉलबैक बनाने के बारे में कैसे जा सकता हूं?
आप ऑब्जेक्ट ऑब्जेक्ट में संदर्भ क्यों नहीं रखते हैं, जो कि सभी गतिविधियों के लिए उपलब्ध है। – Pentium10
मैं वास्तव में इस सुबह के बारे में सोच रहा था। क्या मैं अभी भी ऊपर की तरह सेवा बनाउंगा और बस इसे शुरू कर दूंगा और इसे अपने आवेदन ऑब्जेक्ट में बांध दूंगा? –
एक स्थिर चर वाला सिंगलटन क्लास भी एक विकल्प है। – st0le