SQLite
 sql >> डेटाबेस >  >> RDS >> SQLite

क्या मुझे अपने डेटाबेस में प्रत्येक तालिका के लिए SQLiteOpenHelper विरासत में मिली कक्षा बनानी चाहिए?

डेटाबेस में सभी तालिकाओं के लिए आपको केवल एक डेटाबेस सहायक की आवश्यकता होती है और इस प्रकार आप एक ऑनक्रिएट का उपयोग करेंगे टेबल बनाने की विधि। यह देखते हुए कि यदि आपके पास एकाधिक डेटाबेस सहायक हैं तो ऑनक्रिएट (और अपडेट पर मेथड) को डेटाबेस खोलने वाले पहले हेल्पर द्वारा केवल एक बार कॉल किया जाएगा और इस प्रकार कई हेल्पर्स के अक्षम होने के अलावा कई डेटाबेस हेल्पर्स का होना अधिक जटिल हो सकता है।

अधिक विशेष रूप से बनाने पर केवल तभी स्वचालित रूप से कॉल किया जाता है जब डेटाबेस मौजूद नहीं होता है। उस समय तक ऑनक्रिएट कहा जाता है कि डेटाबेस ही बनाया गया है।

अपडेट पर केवल तभी कॉल किया जाता है जब डेटाबेस खोलने पर, कॉल को दी गई संस्करण संख्या (सुपर कॉल के माध्यम से) डेटाबेस फ़ाइल में संग्रहीत संस्करण संख्या से अधिक होती है। फ़ाइल में संग्रहीत संस्करण संख्या, इस समय, नए संस्करण को दर्शाने के लिए अद्यतन की जाती है। इसलिए बाद की कॉल अपग्रेड पर को लागू नहीं करेंगी विधि।

आप विधियों और पहचानकर्ताओं को विभाजित करते हैं या नहीं, जैसे कि अलग-अलग तालिकाओं के लिए कॉलम/टेबल नाम एक विकल्प है जिसे आप बना सकते हैं। कुछ लोग इसे दूसरों को विभाजित करने के लिए अजीब मान सकते हैं यह सोच सकते हैं कि यह अधिक स्पष्ट है।

उदाहरण

निम्नलिखित कोड 3 क्रमपरिवर्तन (और डेटाबेस भी) का एक उदाहरण है जो सभी 2 तालिकाओं का उपयोग करता है, अर्थात् table001 (कॉलम _id और माईडेटा ) और table001 (स्तंभ नाम _id और मायोदरडेटा )।

  1. सहायक के भीतर एम्बेडेड सब कुछ के साथ एक डेटाबेस हेल्पर (डीबीएचल्पर001) का उपयोग करता है। डेटाबेस mydb001 है

  2. तालिका विशिष्ट विधियों और स्थिरांक के साथ एक एकल डेटाबेस हेल्पर (DBHelper002) का उपयोग विशिष्ट तालिका उन्मुख वर्गों (कक्षा तालिका001 और वर्ग तालिका002) में करता है।

  3. दो अलग डेटाबेस हेल्पर्स (DBHelperTable001 और DBHelperTable002) का उपयोग करता है और कोड की सरलता के लिए Table001 और Table002 क्लासेस का उपयोग करता है।

    • ध्यान दें कि बनाने पर पर काबू पाने के लिए केवल एक बार ओपन पर . कॉल किया जा रहा है विधि भी संबंधित तालिका बनाने का प्रयास करती है (CREATE TABLE IF NOT EXISTS ...... इस मामले में महत्वपूर्ण होने के कारण विफलता को रोकने के लिए जब तालिका वास्तव में मौजूद होती है)।
    • ध्यान दें कि यह एकाधिक सहायक होने की केवल एक अक्षमता है।

पहले तालिका विशिष्ट वर्ग (पहले क्रमपरिवर्तन द्वारा उपयोग नहीं किया गया)

Table001.java

public class Table001 {

    public static final String TBL_TABLE001 = "table001";
    public static final String COL_TABLE001_ID = BaseColumns._ID;
    public static final String COL_TABLE001_MYDATA = "mydata";

    public static String getCrtSQL() {
        return "CREATE TABLE IF NOT EXISTS " + TBL_TABLE001 + "(" +
                COL_TABLE001_ID + " INTEGER PRIMARY KEY, " +
                COL_TABLE001_MYDATA + " TEXT" +
                ")";
    }

    public static long insert(SQLiteDatabase db, String mydata) {
        ContentValues cv = new ContentValues();
        cv.put(COL_TABLE001_MYDATA,mydata);
        return db.insert(TBL_TABLE001,null,cv);
    }

    public static Cursor getAll(SQLiteDatabase db) {
        return db.query(TBL_TABLE001,null,null,null,null,null,null);
    }
}

तालिका002.जावा

public class Table002 {

    public static final String TBL_TABLE002 = "table002";
    public static final String COL_TABLE002_ID = BaseColumns._ID;
    public static final String COL_TABLE002_MYOTHERDATA = "myotherdata";

    public static String getCrtSQL() {
        return "CREATE TABLE IF NOT EXISTS " + TBL_TABLE002 + "(" +
                COL_TABLE002_ID + " INTEGER PRIMARY KEY, " +
                COL_TABLE002_MYOTHERDATA + " TEXT" +
                ")";
    }

    public static long insert(SQLiteDatabase db, String mydata) {
        ContentValues cv = new ContentValues();
        cv.put(COL_TABLE002_MYOTHERDATA,mydata);
        return db.insert(TBL_TABLE002,null,cv);
    }

    public static Cursor getAll(SQLiteDatabase db) {
        return db.query(TBL_TABLE002,null,null,null,null,null,null);
    }
}

चार डेटाबेस सहायक वर्ग

DBHelper001.java - (स्व-निहित)

public class DBHelper001 extends SQLiteOpenHelper {

    public static final String DBNAME = "mydb001";
    public static final int DBVERSION = 1;

    public static final String TBL_TABLE001 = "table001";
    public static final String TBL_TABLE002 = "table002";
    public static final String COL_TABLE001_ID = BaseColumns._ID;
    public static final String COL_TABLE001_MYDATA = "mydata";
    public static final String COL_TABLE002_ID = BaseColumns._ID;
    public static final String COL_TABLE002_MYOTHERDATA = "myotherdata";

    public DBHelper001(Context context) {
        super(context, DBNAME, null, DBVERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String crt_table001_sql = "CREATE TABLE IF NOT EXISTS " + TBL_TABLE001 + "(" +
                COL_TABLE001_ID + " INTEGER PRIMARY KEY," +
                COL_TABLE001_MYDATA + " TEXT" +
                ")";
        String crt_table002_sql = "CREATE TABLE IF NOT EXISTS " + TBL_TABLE002 + "(" +
                COL_TABLE002_ID + " INTEGER PRIMARY KEY," +
                COL_TABLE002_MYOTHERDATA + " TEXT" +
                ")";
        db.execSQL(crt_table001_sql);
        db.execSQL(crt_table002_sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    public long insertIntoTable001(String mydata) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(COL_TABLE001_MYDATA,mydata);
        return db.insert(TBL_TABLE001,null,cv);
    }

    public long insertIntoTable002(String myotherdata) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(COL_TABLE002_MYOTHERDATA,myotherdata);
        return db.insert(TBL_TABLE002,null,cv);
    }

    public Cursor getAllFromTable001() {
        SQLiteDatabase db = this.getWritableDatabase();
        return db.query(TBL_TABLE001,null,null,null,null,null,null);
    }

    public Cursor getAllFromTable002() {
        SQLiteDatabase db = this.getWritableDatabase();
        return db.query(TBL_TABLE002,null,null,null,null,null,null);
    }
}

DBHelper002.java (तालिका विशिष्ट कोड कहीं और)

public class DBHelper002 extends SQLiteOpenHelper {

    public static final String DBNAME = "mydb002";
    public static final int DBVERSION = 1;

    public DBHelper002(Context context) {
        super(context, DBNAME, null, DBVERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(Table001.getCrtSQL());
        db.execSQL(Table002.getCrtSQL());
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

DBHelperTable001.java (table001 विशिष्ट सहायक)

public class DBHelperTable001 extends SQLiteOpenHelper {

    public static final String DBNAME = "mydb003";
    public static final int DBVERSION = 1;

    public DBHelperTable001(Context context) {
        super(context, DBNAME, null, DBVERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(Table001.getCrtSQL());
        //NOTE Table002 won't get created as onCreate is only called once
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        db.execSQL(Table001.getCrtSQL());
    }
}
  • नोट खुले पर मेथड का उपयोग ऑनक्रिएट को रोकने के लिए किया जाता है जिसे डेटाबेस के जीवनकाल के लिए केवल एक बार लागू किया जाता है।
    • execSQL को लागू करना इस पद्धति की अक्षमता का एक उदाहरण है।

DBHelperTable002.java (तालिका002 विशिष्ट सहायक)

public class DBHelperTable002 extends SQLiteOpenHelper {

    public static final String DBNAME = "mydb003";
    public static final int DBVERSION = 1;

    public DBHelperTable002(Context context) {
        super(context, DBNAME, null, DBVERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(Table002.getCrtSQL());
        //NOTE Table001 won't get created as onCreate is only called once
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        db.execSQL(Table002.getCrtSQL());
    }
}

सब को एक साथ बांधना

निम्नलिखित गतिविधि का उपयोग करती है (MainActivity.java ) सभी 3 क्रमपरिवर्तन का उपयोग करता है। प्रत्येक तालिका के लिए प्रत्येक पंक्ति को जोड़ा जाता है और फिर प्रत्येक तालिका से सभी डेटा को एक कर्सर में निकाला जाता है जिसे बाद में डंप किया जाता है (लॉग में आउटपुट)।

ध्यान दें कि तालिका विशिष्ट सहायकों के लिए प्रत्येक सहायक का उपयोग पंक्तियों को निकालने के लिए किया जाता है (अतिरेक पहलू दिखाते हुए)।

MainActivity.java

public class MainActivity extends AppCompatActivity {

    DBHelper001 mDBHlpr1;
    DBHelper002 mDBHlpr2;
    DBHelperTable001 mTblDBHlpr1;
    DBHelperTable002 mTblDBHlpr2;
    Cursor mCsr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mDBHlpr1 = new DBHelper001(this);
        mDBHlpr1.insertIntoTable001("my data for table001 in mydb001");
        mDBHlpr1.insertIntoTable002("my other data for table002 in mydb001");
        mCsr = mDBHlpr1.getAllFromTable001();
        DatabaseUtils.dumpCursor(mCsr);
        mCsr = mDBHlpr1.getAllFromTable002();
        DatabaseUtils.dumpCursor(mCsr);


        mDBHlpr2 = new DBHelper002(this);
        Table001.insert(mDBHlpr2.getWritableDatabase(),"my data for table001 in mydb002");
        Table002.insert(mDBHlpr2.getWritableDatabase(),"my other data for table002 in mydb002");
        mCsr = Table001.getAll(mDBHlpr2.getWritableDatabase());
        DatabaseUtils.dumpCursor(mCsr);
        mCsr = Table002.getAll(mDBHlpr2.getWritableDatabase());
        DatabaseUtils.dumpCursor(mCsr);

        //Oooops???? wouldn't normally do this
        mCsr = Table001.getAll(mDBHlpr1.getWritableDatabase()); //?????????? from other database!!!
        DatabaseUtils.dumpCursor(mCsr);

        mTblDBHlpr1 = new DBHelperTable001(this);
        Table001.insert(mTblDBHlpr1.getWritableDatabase(),"my data for table001 in mydb003");
        mTblDBHlpr2 = new DBHelperTable002(this);
        Table002.insert(mTblDBHlpr2.getWritableDatabase(),"my data for table002 in mydb003");
        mCsr = Table001.getAll(mTblDBHlpr1.getWritableDatabase());
        DatabaseUtils.dumpCursor(mCsr);
        mCsr = Table002.getAll(mTblDBHlpr1.getWritableDatabase()); //???????????? but OK
        DatabaseUtils.dumpCursor(mCsr);
        mCsr = Table001.getAll(mTblDBHlpr2.getWritableDatabase());
        DatabaseUtils.dumpCursor(mCsr);
        mCsr = Table002.getAll(mTblDBHlpr2.getWritableDatabase()); //??????????? but OK
        DatabaseUtils.dumpCursor(mCsr);
    }
}

परिणाम

पहले रन का परिणाम निम्नलिखित है (ऐप को अनइंस्टॉल किए बिना कई बार चलने वाले नोट के परिणामस्वरूप 2 नई पंक्तियां जोड़ी जाएंगी) :-

03-06 11:27:18.453 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
03-06 11:27:18.453 11093-11093/? I/System.out: 0 {
03-06 11:27:18.453 11093-11093/? I/System.out:    _id=1
03-06 11:27:18.453 11093-11093/? I/System.out:    mydata=my data for table001 in mydb001
03-06 11:27:18.453 11093-11093/? I/System.out: }
03-06 11:27:18.453 11093-11093/? I/System.out: <<<<<
03-06 11:27:18.453 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
03-06 11:27:18.453 11093-11093/? I/System.out: 0 {
03-06 11:27:18.453 11093-11093/? I/System.out:    _id=1
03-06 11:27:18.453 11093-11093/? I/System.out:    myotherdata=my other data for table002 in mydb001
03-06 11:27:18.453 11093-11093/? I/System.out: }
03-06 11:27:18.453 11093-11093/? I/System.out: <<<<<


03-06 11:27:18.472 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
03-06 11:27:18.472 11093-11093/? I/System.out: 0 {
03-06 11:27:18.472 11093-11093/? I/System.out:    _id=1
03-06 11:27:18.472 11093-11093/? I/System.out:    mydata=my data for table001 in mydb002
03-06 11:27:18.472 11093-11093/? I/System.out: }
03-06 11:27:18.472 11093-11093/? I/System.out: <<<<<
03-06 11:27:18.472 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
03-06 11:27:18.473 11093-11093/? I/System.out: 0 {
03-06 11:27:18.473 11093-11093/? I/System.out:    _id=1
03-06 11:27:18.473 11093-11093/? I/System.out:    myotherdata=my other data for table002 in mydb002
03-06 11:27:18.473 11093-11093/? I/System.out: }
03-06 11:27:18.473 11093-11093/? I/System.out: <<<<<


03-06 11:27:18.473 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
03-06 11:27:18.473 11093-11093/? I/System.out: 0 {
03-06 11:27:18.473 11093-11093/? I/System.out:    _id=1
03-06 11:27:18.473 11093-11093/? I/System.out:    mydata=my data for table001 in mydb001
03-06 11:27:18.473 11093-11093/? I/System.out: }
03-06 11:27:18.473 11093-11093/? I/System.out: <<<<<


03-06 11:27:18.499 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
03-06 11:27:18.500 11093-11093/? I/System.out: 0 {
03-06 11:27:18.500 11093-11093/? I/System.out:    _id=1
03-06 11:27:18.500 11093-11093/? I/System.out:    mydata=my data for table001 in mydb003
03-06 11:27:18.500 11093-11093/? I/System.out: }
03-06 11:27:18.500 11093-11093/? I/System.out: <<<<<
03-06 11:27:18.500 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
03-06 11:27:18.500 11093-11093/? I/System.out: 0 {
03-06 11:27:18.501 11093-11093/? I/System.out:    _id=1
03-06 11:27:18.501 11093-11093/? I/System.out:    myotherdata=my data for table002 in mydb003
03-06 11:27:18.501 11093-11093/? I/System.out: }
03-06 11:27:18.501 11093-11093/? I/System.out: <<<<<
03-06 11:27:18.501 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
03-06 11:27:18.501 11093-11093/? I/System.out: 0 {
03-06 11:27:18.501 11093-11093/? I/System.out:    _id=1
03-06 11:27:18.501 11093-11093/? I/System.out:    mydata=my data for table001 in mydb003
03-06 11:27:18.501 11093-11093/? I/System.out: }
03-06 11:27:18.502 11093-11093/? I/System.out: <<<<<
03-06 11:27:18.502 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
03-06 11:27:18.502 11093-11093/? I/System.out: 0 {
03-06 11:27:18.502 11093-11093/? I/System.out:    _id=1
03-06 11:27:18.502 11093-11093/? I/System.out:    myotherdata=my data for table002 in mydb003
03-06 11:27:18.503 11093-11093/? I/System.out: }
03-06 11:27:18.503 11093-11093/? I/System.out: <<<<<



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. लॉगकैट अमान्य कॉलम डेटा 1 कहता है

  2. एंड्रॉइड में SQLite डेटाबेस से निपटने वाले तरीकों का परीक्षण कैसे करें?

  3. Entity Developer और ADO.Net डेटा प्रदाता अब Entity Framework Core 5 का समर्थन करते हैं

  4. एंड्रॉइड डिवाइस में डेटा/डेटा फ़ोल्डर तक कैसे पहुंचें?

  5. SQLite मिन () कैसे काम करता है