2011-05-13 14 views
5

प्रारंभ करने के लिए कहां और कब मैं अपने ऐप में एसक्लाइट का उपयोग करने में वास्तव में संघर्ष कर रहा हूं;एंड्रॉइड एसक्यूएलसाइट SQLiteOpenHelper

मैं एक डेटाबेस सहायक वर्ग कि SQLiteOpenHelper

तक फैली हुई है
public class DatabaseHelper extends SQLiteOpenHelper { 

OnCreate में मैं के बारे में 6 टेबल बनाना हूँ की स्थापना की है:

public void onCreate(SQLiteDatabase db) { 
db.execSQL("CREATE TABLE myTestTable (Id INTEGER PRIMARY KEY , " 
      + "info TEXT," + 
      + "TopLeft TEXT")); <-- example insert 

} 

जब मेरे अनुप्रयोग मैं कुछ XML पार्सिंग और कर रहा हूँ शुरू होता है तालिका में डेटा दर्ज करना, और मैंने डेटाबेस की जांच की है और सब वहाँ है और मेरी टेबल सही ढंग से बनाई गई हैं।

जब मैं डेटा कॉल करने जाता हूं तो यह चला जाता है! मेरे पास मेरे डबेलर वर्ग के भीतर और प्रत्येक गतिविधि पर कई अलग-अलग प्रश्न हैं; मैं कक्षा को फिर से समायोजित कर रहा हूं ताकि मैं कक्षा के भीतर अपने कार्य में प्राप्त कर सकूं।

मुझे लगता है कि यह ऐसा करने का तरीका नहीं है क्योंकि यह मेरे ऑनक्रेट को फिर से चलाता है और मेरी सभी टेबल मिटा देता है (या कम से कम ऐसा लगता है जब मैं डेटा को कॉल करने का प्रयास करने के बाद डीबी की जांच करता हूं यह और यह खाली है!

मैं छाप OnCreate केवल एक बार भाग गया के तहत किया गया है, लेकिन इस मामले में स्पष्ट रूप के रूप में यह मेरी डीबी हर पुनः बनाने और अपने डेटा पोंछते प्रतीत होता नहीं है!

तुम कहाँ के लिए होती हैं डबेलर क्लास को शुरू करें और आप इसे टेबल को दोबारा कैसे रोकते हैं? मुझे ऐप बंद होने पर भी जारी रखने के लिए डेटा चाहिए!

मैं उलझन में हूँ!

यदि यह समझ में नहीं आता है तो कृपया विशिष्ट प्रश्न पूछें कि मैं इसे कैसे स्पष्ट कर सकता हूं!

अद्यतन

मैं पाया है मैं

CREATE TABLE IF NOT EXISTS 

कौन सा यह बंद हो जाता है टेबल पुनः जोड़ सकते हैं, लेकिन यह अभी भी सही OnCreate हर बार बुला प्रतीत नहीं होता ..

+0

अच्छा प्रश्न और मुझे आशा है कि कोई एक जवाब के साथ आता है जहाँ तक अपने "सम्मिलित", हालांकि आप लेन-देन डेटाबेस बंद करने से पहले सफल अंकन कर रहे हैं? –

+0

क्या आपकी कक्षा को स्थैतिक रूप से समस्या को ठीक करने की घोषणा करता है? –

+0

@DAVE G सभी डेटा निश्चित रूप से डीबी में जा रहे हैं, क्या मैं डालने के बाद डीबी को बंद करना चाहता हूं? वर्तमान में बस कर रहे हैं: \t SQLiteDatabase db = this.getWritableDatabase(); .... सभी डेटा को collating और कर रहा है: db.insert ("TABLENAME", शून्य, सीवी); ... और इसका अंत है ?! – Bex

उत्तर

2

आप इसके चारों ओर एक रैपर वर्ग डाल सकते हैं?

public class DbAdapter 
{ 

    // database details 
    private static final String DATABASE_NAME = "dbname"; 
    private static final int DATABASE_VERSION = 1; 

    // where we're running 
    private final Context mCtx; 

    private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
    DatabaseHelper(Context context) 
    { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 
     // your initial database create statements go here 
     db.execSQL(DATABASE_CREATE); 
    } 

    // if you need to recreate the database, you just up the version number 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    { 
     // drop commands for each table goes here 
     db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
     onCreate(db); 
    } 
    } 

    public DbAdapter(Context ctx) 
    { 
    this.mCtx = ctx; 
    } 

    public DbAdapter open() throws SQLException 
    { 
    mDbHelper = new DatabaseHelper(mCtx); 
    mDb = mDbHelper.getWritableDatabase(); 
    return this; 
    } 

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

    // other database methods can go here 
} 
0

मुझे यकीन नहीं है कि कथन द्वारा आपका क्या मतलब है -

"प्रत्येक गतिविधि I; मैं कक्षा को फिर से समायोजित कर रहा हूं ताकि मैं प्राप्त कर सकूं कक्षा के भीतर मेरा कार्य। "

प्रत्येक गतिविधि में जहां आपको डेटाबेस तक पहुंचने की आवश्यकता है, आपको बस डेटाबेस खोलना है, टेबल में डेटा एक्सेस/अपडेट करना है, और हैंडलर को बंद करना है।

आप इस सरल नमूना नोटपैड app देखा है -

NotePad sample app by Google

हो सकता है कि आपकी मदद करेंगे

1

onCreate() विधि केवल पहली बार जब आप आप डेटाबेस का उपयोग करने के लिए कोशिश करते हैं और यह नहीं बनाई है कहा जाता है। तो onCreate() केवल एक बार बुलाया जाएगा। getWritableDatabase एक डीबी ऑब्जेक्ट देता है और यदि आवश्यक हो तो onCreate() पर कॉल करेगा। NotePadProviderSQLiteOpenHelper का उपयोग करने के लिए एक अच्छा उदाहरण देता है।

+0

जब आप पहली बार डेटाबेस तक पहुंचते हैं, तो क्या आपका मतलब हमेशा "सत्र" के दौरान होता है? – Bex

+0

मेरा मतलब है .... –

+0

नोटपैड नमूना ऐप का लिंक टूटा हुआ है। कोई विचार जहां यह चले गए? – syonip

0

डीबी प्रारंभिक कोड आपके हेल्पर की ऑनक्रेट विधि में जाना चाहिए। एंड्रॉयड SQLiteOpenHelper javadocs से:

/** 
* Called when the database is created for the first time. This is where the 
* creation of tables and the initial population of the tables should happen. 
* 
* @param db The database. 
*/ 
public abstract void onCreate(SQLiteDatabase db); 
संबंधित मुद्दे