मैं SQLite में कैसे जांचूं कि कोई तालिका मौजूद है या नहीं?




(12)

SQLite कॉर्डोवा के लिए यह मेरा कोड है:

get_columnNames('LastUpdate', function (data) {
    if (data.length > 0) { // In data you also have columnNames
        console.log("Table full");
    }
    else {
        console.log("Table empty");
    }
});

और दूसरा जो है:

function get_columnNames(tableName, callback) {
    myDb.transaction(function (transaction) {
        var query_exec = "SELECT name, sql FROM sqlite_master WHERE type='table' AND name ='" + tableName + "'";
        transaction.executeSql(query_exec, [], function (tx, results) {
            var columnNames = [];
            var len = results.rows.length;
            if (len>0){
                var columnParts = results.rows.item(0).sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').split(','); ///// RegEx
                for (i in columnParts) {
                    if (typeof columnParts[i] === 'string')
                        columnNames.push(columnParts[i].split(" ")[0]);
                };
                callback(columnNames);
            }
            else callback(columnNames);
        });
    });
}

मैं, विश्वसनीय रूप से , SQLite में जांच कैसे करूं, चाहे कोई विशेष उपयोगकर्ता तालिका मौजूद हो?

मैं अविश्वसनीय तरीकों के बारे में नहीं पूछ रहा हूं जैसे कि तालिका पर "चयन *" एक त्रुटि लौटाता है या नहीं (क्या यह भी एक अच्छा विचार है?)।

कारण इस तरह है:

मेरे कार्यक्रम में, मुझे कुछ तालिकाओं को बनाने और फिर पॉप्युलेट करने की आवश्यकता है यदि वे पहले से मौजूद नहीं हैं।

यदि वे पहले से मौजूद हैं, तो मुझे कुछ तालिकाओं को अपडेट करने की आवश्यकता है।

क्या मुझे सिग्नल करने के बजाय कुछ अन्य पथ लेना चाहिए कि प्रश्नों की तालिका पहले ही बनाई जा चुकी है - उदाहरण के लिए, डिस्क या कुछ पर मेरे प्रोग्राम प्रारंभिकरण / सेटिंग्स फ़ाइल में एक निश्चित झंडा बनाने / डालने / स्थापित करने के लिए कहें?

या मेरा दृष्टिकोण समझ में आता है?


SQLite तालिका नाम केस असंवेदनशील हैं, लेकिन तुलना डिफ़ॉल्ट रूप से केस संवेदनशील है। इस मामले को सभी मामलों में ठीक से करने के लिए आपको COLLATE NOCASE जोड़ने की आवश्यकता है।

SELECT name FROM sqlite_master WHERE type='table' AND name='table_name' COLLATE NOCASE

इसे देखें:

SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;

उपयोग

SELECT 1 FROM table LIMIT 1;

सभी रिकॉर्ड पढ़ने से रोकने के लिए।


एक साधारण चयन क्वेरी का उपयोग करना - मेरी राय में - काफी विश्वसनीय है। अधिकांश में यह कई अलग-अलग डेटाबेस प्रकारों (SQLite / MySQL) में तालिका अस्तित्व की जांच कर सकता है।

SELECT 1 FROM table;

यह समझ में आता है कि जब आप क्वेरी सफल हुई है तो यह निर्धारित करने के लिए आप अन्य विश्वसनीय तंत्र का उपयोग कर सकते हैं (उदाहरण के लिए, आप QTqlQuery के माध्यम से Qt में डेटाबेस से पूछताछ करते हैं)।


चयन NAME के ​​बजाय SELECT COUNT (*) का उपयोग करना एक भिन्नता है, यानी

SELECT count(*) FROM sqlite_master WHERE type='table' AND name='table_name';

यदि तालिका मौजूद नहीं है, तो यह 0 वापस आ जाएगा, अगर ऐसा होता है। यह संभवतः आपके प्रोग्रामिंग में उपयोगी है क्योंकि संख्यात्मक परिणाम प्रक्रिया के लिए तेज़ / आसान है। निम्नलिखित बताते हैं कि पैरामीटर के साथ SQLiteDatabase, कर्सर, rawQuery का उपयोग करके आप एंड्रॉइड में यह कैसे करेंगे।

boolean tableExists(SQLiteDatabase db, String tableName)
{
    if (tableName == null || db == null || !db.isOpen())
    {
        return false;
    }
    Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM sqlite_master WHERE type = ? AND name = ?", new String[] {"table", tableName});
    if (!cursor.moveToFirst())
    {
        cursor.close();
        return false;
    }
    int count = cursor.getInt(0);
    cursor.close();
    return count > 0;
}

तुम कोशिश कर सकते हो:

SELECT name FROM sqlite_master WHERE name='table_name'

ध्यान दें कि यह जांचने के लिए कि कोई तालिका TEMP डेटाबेस में मौजूद है या नहीं, आपको sqlite_temp_master बजाय sqlite_temp_master उपयोग करना होगा:

SELECT name FROM sqlite_temp_master WHERE type='table' AND name='table_name';

मैंने सोचा कि मैं इस चर्चा में अपने 2 सेंट रखूंगा, भले ही यह पुराना हो .. यह क्वेरी स्केलर 1 लौटाती है यदि तालिका मौजूद है और 0 अन्यथा।

select 
    case when exists 
        (select 1 from sqlite_master WHERE type='table' and name = 'your_table') 
        then 1 
        else 0 
    end as TableExists

यदि आप fmdb का उपयोग कर रहे हैं, तो मुझे लगता है कि आप केवल FMDatabaseAdditions आयात कर सकते हैं और बूल फ़ंक्शन का उपयोग कर सकते हैं:

[yourfmdbDatabase tableExists:tableName].

यदि आपको "तालिका पहले से मौजूद है" त्रुटि मिल रही है, तो SQL स्ट्रिंग में परिवर्तन निम्नानुसार करें:

CREATE table IF NOT EXISTS table_name (para1,para2);

इस तरह आप अपवादों से बच सकते हैं।


यहां वह फ़ंक्शन है जिसका मैंने उपयोग किया था:

एक SQLDatabase ऑब्जेक्ट = डीबी दिया गया

public boolean exists(String table) {
    try {
         db.query("SELECT * FROM " + table);
         return true;
    } catch (SQLException e) {
         return false;
    }
}




sqlite