2013-04-24 2 views
5

मैं एक डेटाबेस Android पर मोनो का उपयोग कर लागू करने के लिए SQLite शुद्ध (https://github.com/praeclarum/sqlite-net) का उपयोग कर रहा हूँ और का उपयोग करने में SQLite शुद्ध सी # व्यापक क्वेरी बनाना निम्नलिखित है:SQLiteAsyncConnection

public class DatabaseTestASync 
{ 
    private SQLiteAsyncConnection m_db; 

    public delegate void StocksFound(List<Stock> list); 
    public event StocksFound StocksFoundListener; 

    // Uninteresting parts remove, e.g. constructor 

    public void AddStock(Stock stock) 
    { 
     m_db.InsertAsync(stock).ContinueWith(t => { Debug.WriteLine(stock.Symbol + " added"); }); 
    } 

    public void GetAllStocks() 
    { 
     AsyncTableQuery<Stock> query = m_db.Table<Stock>().Where(stock => true); 
     query.ToListAsync().ContinueWith(QueryReturns); 
    } 

    private void QueryReturns(Task<List<Stock>> t) 
    { 
     if (StocksFoundListener != null) 
      StocksFoundListener(t.Result); 
    } 

यह देने के लिए बहुत अच्छा है मुझे एक स्टॉक की सूची, लेकिन मुझे मेरी परियोजना में तालिकाओं का संग्रह होने की परिकल्पना है और प्रत्येक तालिका के लिए एक अलग एडएक्स, गेटएलेक्स, क्वेरीरीटर्न्स (एक्स) आदि बनाना नहीं चाहते हैं। मैं इन डेटाबेस कार्यों करने का एक सामान्य तरीके के बाद कर रहा हूँ और निम्नलिखित की कोशिश की: 'टी' के क्रम में एक सार्वजनिक parameterless निर्माता के साथ एक गैर सार प्रकार होना चाहिए:

public class DBQuery<T> 
{ 
    private SQLiteAsyncConnection m_db; 
    public delegate void OnRecordsFound(List<T> list); 
    public event OnRecordsFound RecordsFoundListener; 

    public DBQuery (SQLiteAsyncConnection db) 
    { 
     m_db = db; 
    } 

    public void GetAllRecords() 
    { 
     AsyncTableQuery<T> query = m_db.Table<T>().Where(r => true); // COMPILE ERROR HERE 
     query.ToListAsync().ContinueWith(QueryReturns); 
    } 

    private void QueryReturns(Task<List<T>> t) 
    { 
     if (RecordsFoundListener != null) 
      RecordsFoundListener(t.Result); 
    } 
} 

हालांकि, यह कह संकलन नहीं है जेनेरिक प्रकार या विधि 'DatabaseUtility.AsyncTableQuery' में पैरामीटर 'टी' के रूप में इसका उपयोग करने के लिए।

इस बारे में कोई भी विचार है कि मैं इस तरह के सामान्य डेटाबेस पहुंच कैसे प्राप्त कर सकता हूं?

उत्तर

5

मैं वास्तव में, SQLite internals पता नहीं है, लेकिन इस सख्ती से के बारे में generics है ...

AsyncTableQuery के बाद से अपने त्रुटि के आधार पर इस

public class AsyncTableQuery<T> 
     where T : new() 
    { 

तरह परिभाषित किया गया है ... या बस आप अपने T पर एक ही बाधा रखना होगा:

public class DBQuery<T> where T : new() 

यदि आप एक कक्षा या एक विधि का उपयोग कर रहे हैं जिसमें constrained generic parameter है - आपको T परिभाषित किया गया है, इस पर निर्भर करते हुए आपको अपनी विधि (या कक्षा, ) पर ऐसा करने की आवश्यकता है।

+0

शानदार, पूरी तरह से काम करता है। धन्यवाद। –