带有 Sqlite 的 Android - 如何检查表是不是存在以及是不是为空

Posted

技术标签:

【中文标题】带有 Sqlite 的 Android - 如何检查表是不是存在以及是不是为空【英文标题】:Android with Sqlite - How to check if table exist and if empty带有 Sqlite 的 Android - 如何检查表是否存在以及是否为空 【发布时间】:2016-09-13 02:43:09 【问题描述】:

如果表格不存在或表格内容为空,我想显示一个警告框。

要检查我正在使用的表是否为空:

        cCheckDB = db.rawQuery("SELECT COUNT(*) FROM " + MainActivity.TABLE_NAME +"", null);

        if (cCheckDB != null) 
            cCheckDB.moveToFirst();

            if (cCheckDB.getInt (0) == 0) 
                // EMPTY
            
        

但是如何将其包装在“如果表存在”中?最好的方法是什么?

我知道检查表是否存在或检查表中是否有内容的两种方法。但如果可能的话,我想以一种有意义的方式使用检查,而不是在单个查询中使用 - 这是我的问题。

【问题讨论】:

请查看此流程***.com/questions/3058909/… 当然我可以捕获异常或创建如果不存在,但这对我的情况没有帮助。我以为还有另一种方法 【参考方案1】:

希望,这对你有帮助。 效果很好!!!

public boolean isTableExists(String tableName, boolean openDb) 
    if(openDb) 
        if(mDatabase == null || !mDatabase.isOpen()) 
            mDatabase = getReadableDatabase();
        

        if(!mDatabase.isReadOnly()) 
            mDatabase.close();
            mDatabase = getReadableDatabase();
        
    

    Cursor cursor = mDatabase.rawQuery("select DISTINCT tbl_name from sqlite_master where tbl_name = '"+tableName+"'", null);
    if(cursor!=null) 
        if(cursor.getCount()>0) 
                            cursor.close();
            return true;
        
                    cursor.close();
    
    return false;

【讨论】:

它的工作。之后我可以用它来检查表是否为空 它只检查表是否存在。 我想合并这两项检查,但看起来这是不可能的。所以我将使用这个函数和一个 if 子句来检查之后的内容。这对我来说是最好的解决方案【参考方案2】:

要检查您的表是否存在,您可以使用:

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

在此处,将 table_name 替换为您要更改的表名

前:

SELECT name FROM sqlite_master WHERE type='table' AND name='Employee_Details';

【讨论】:

检查我编辑的答案。如果该表存在,它会给你结果 所以我必须分开一张表检查和一张表是否为空。没有其他方法可以将这两项检查结合起来吗? 如果表不存在则不需要检查它是否为空而不是检查***.com/questions/22630307/… 如果我在不存在的表上使用选择查询将得到一个空指针 您需要做的是,首先检查表是否存在,然后您可以检查该表中的数据。+【参考方案3】:

更优化的方法是先检查表是否存在,然后再检查记录是否存在

 private void clearTable(String tableName) 
        int count;
        Cursor cursor = db.rawQuery("SELECT count(*) FROM sqlite_master WHERE type='table' AND " +
                "name= " + tableName, null);
        cursor.moveToFirst();
        count = cursor.getInt(0);
        if (!cursor.isClosed())
            cursor.close();

        if (count > 0)//table exist now delete record if it exist
        
            cursor=db.rawQuery("select exists(select 1 FROM " + tableName + ")", null);
            cursor.moveToFirst();
            count = cursor.getInt(0);
            if (!cursor.isClosed())
                cursor.close();
            if (count > 0)
                db.execSQL("delete from " + tableName);
        
    

【讨论】:

有什么线索可以将两者结合起来有意义吗?这就是我想知道的:) 检查我编辑的答案我在 Firefox 的 sqlite 工具中测试过 您需要先检查表是否存在而不是检查记录是否存在,因为没有组合查询可以同时检查表的存在性和记录。直到我搜索。

以上是关于带有 Sqlite 的 Android - 如何检查表是不是存在以及是不是为空的主要内容,如果未能解决你的问题,请参考以下文章

带有 FMDB 包装器的 Sqlite 数据库不插入数据

DataNucleus 支持带有内置 sqlite 或远程数据库的 android?

sqlite android提取带有电话号码的联系人

带有 SQLite 的 Android 应用程序在 ICS 中运行,但在 Jelly Bean 中不运行 - IllegalStateException

如何使用内容提供程序在 Sqlite 数据库中查询 Android 中的时间戳列?

带有 SQLite 数据库的 Cordova 应用程序在 iOS 中首次运行后冻结,但在 Android 中运行良好